os x shell上 为什么 这段代码跑出来没有n 的”_" 的显示?
发布网友
发布时间:2022-04-24 13:47
我来回答
共1个回答
热心网友
时间:2023-10-15 01:34
进行linux测试编写脚本必少Shell脚本名称随便定义要缀名例写abcsmartzip类名称运行要键入
./smartzip能运行脚本
每行命令处用空格行
第1部. Linux 脚本编写基础
1.1 语基本介绍
1.1.1
程序必须面行始(必须文件第行):
#!/bin/sh
符号#!用告诉系统面参数用执行该文件程序例我使用/bin/sh执行程序
编辑脚本要执行该脚本必须使其执行
要使脚本执行:
编译 chmod +x filename 才能用./filename 运行
1.1.2 注释
进行shell编程#句表示注释直行结束我真诚建议您程序使用注释
您使用注释即使相间内没使用该脚本您能短间内明白该脚本作用及工作原理
1.1.3 变量
其编程语言您必须使用变量shell编程所变量都由字符串组并且您需要变量进行声明要赋值给变量您写:
#!/bin/sh
#变量赋值:
a="hello world"
# 现打印变量a内容:
echo "A is:"
echo $a
候变量名容易与其文字混淆比:
num=2
echo "this is the $numnd"
并打印"this is the 2nd"仅仅打印"this is the "shell搜索变量numnd值变量没值使用花括号告诉shell我要打印num变量:
num=2
echo "this is the ${num}nd"
打印: this is the 2nd
1.1.4 环境变量
由export关键字处理变量叫做环境变量我环境变量进行讨论通情况仅仅登录脚本使用环境变量
1.1.5 Shell命令流程控制
shell脚本使用三类命令:
1)Unix 命令:
虽shell脚本使用任意unix命令由些相更用命令些命令通用进行文件文字操作
用命令语及功能
echo "some text": 文字内容打印屏幕
ls: 文件列表
wc –l file :计算文件行数
wc -w file:计算文件单词数
wc -c file:计算文件字符数
cp sourcefile destfile: 文件拷贝
mv oldname newname : 重命名文件或移文件
rm file: 删除文件
grep 'pattern' file: 文件内搜索字符串比:grep 'searchstring' file.txt
cut -b colnum file: 指定欲显示文件内容范围并输标准输设备比:输每行第5第9字符cut -b5-9 file.txt千万要cat命令混淆
两完全同命令
cat file.txt: 输文件内容标准输设备(屏幕)
file somefile: 文件类型
read var: 提示用户输入并输入赋值给变量
sort file.txt: file.txt文件行进行排序
uniq: 删除文本文件现行列比: sort file.txt | uniq
expr: 进行数运算Example: add 2 and 3expr 2 "+" 3
find: 搜索文件比:根据文件名搜索find . -name filename -print
tee: 数据输标准输设备(屏幕) 文件比:somecommand | tee outfile
basename file: 返包含路径文件名比: basename /bin/tux返 tux
dirname file: 返文件所路径比:dirname /bin/tux返 /bin
head file: 打印文本文件几行
tail file : 打印文本文件末尾几行
sed: Sed基本查找替换程序标准输入(比命令管道)读入文本并
结输标准输(屏幕)该命令采用则表达式(见参考)进行搜索要shell通配符相混淆比:linuxfocus 替换LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.file awk: awk 用文本文件提取字段缺省字段割符空格使用-F指定其割符
cat file.txt | awk -F, '{print $1 "," $3 }'我使用作字段割符同打印第第三字段该文件内容: Adam Bor, 34, IndiaKerry Miller, 22, USA命令输结:Adam Bor, IndiaKerry Miller, USA
2) 概念: 管道, 重定向backtick
些系统命令真重要
管道 (|) 命令输作另外命令输入
grep "hello" file.txt | wc -l
file.txt搜索包含hello行并计算其行数
grep命令输作wc命令输入您使用命令
重定向:命令结输文件标准输(屏幕)
> 写入文件并覆盖旧文件
>> 加文件尾部保留旧文件内容
反短斜线
使用反短斜线命令输作另外命令命令行参数
命令:
find . -mtime -1 -type f -print
用查找24(-mtime –2则表示48)内修改文件您想所查找文件打包则使用脚本:
#!/bin/sh
# The ticks are backticks (`) not normal quotes ('):
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
3)流程控制
1.if
"if" 表达式 条件真则执行then面部:
if ....; then
....
elif ....; then
....
else
....
fi
数情况使用测试命令条件进行测试比比较字符串、判断文件否存及否读等等…
通用" [ ] "表示条件测试注意空格重要要确保括号空格
[ -f "somefile" ] :判断否文件
[ -x "/bin/ls" ] :判断/bin/ls否存并执行权限
[ -n "$var" ] :判断$var变量否值
[ "$a" = "$b" ] :判断$a$b否相等
执行man test查看所测试表达式比较判断类型
直接执行脚本:
#!/bin/sh
if [ "$SHELL" = "/bin/bash" ]; then
echo "your login shell is the bash (bourne again shell)"
else
echo "your login shell is not bash but $SHELL"
fi
变量$SHELL包含登录shell名称我/bin/bash进行比较
快捷操作符
熟悉C语言朋友能喜欢面表达式:
[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"
&& 快捷操作符左边表达式真则执行右边语句
您认逻辑运算与操作例表示/etc/shadow文件存则打印 This computer uses shadow passwors同或操作(||)shell编程用例:
#!/bin/sh
mailfolder=/var/spool/mail/james
[ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }
echo "$mailfolder has mail from:"
grep "^From " $mailfolder
该脚本首先判断mailfolder否读读则打印该文件"From" 行读则或操作效打印错误信息脚本退问题我必须两命令:
-打印错误信息
-退程序
我使用花括号匿名函数形式两命令放起作命令使用般函数文提及
用与或操作符我用if表达式作任何事情使用与或操作符更便利
2.case
case :表达式用匹配给定字符串数字
case ... in
...) do something here ;;
esac
让我看例 file命令辨别给定文件文件类型比:
file lf.gz
返:
lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix
我利用点写叫做smartzip脚本该脚本自解压bzip2, gzip zip 类型压缩文件:
#!/bin/sh
ftype=`file "$1"`
case "$ftype" in
"$1: Zip archive"*)
unzip "$1" ;;
"$1: gzip compressed"*)
gunzip "$1" ;;
"$1: bzip2 compressed"*)
bunzip2 "$1" ;;
*) echo "File $1 can not be uncompressed with smartzip";;
esac
您能注意我使用特殊变量$1该变量包含传递给该程序第参数值
说我运行:
smartzip articles.zip
$1 字符串 articles.zip
3. selsect
select 表达式种bash扩展应用尤其擅于交互式使用用户组同值进行选择
select var in ... ; do
break
done
.... now $var can be used ....
面例:
#!/bin/sh
echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
break
done
echo "You have selected $var"
面该脚本运行结:
What is your favourite OS?
1) Linux
2) Gnu Hurd
3) Free BSD
4) Other
#? 1
You have selected Linux
4.loop
loop表达式:
while ...; do
....
done
while-loop 运行直表达式测试真will run while the expression that we test for is true.
关键字"break" 用跳循环关键字continue用执行余部直接跳循环
for-loop表达式查看字符串列表 (字符串用空格隔) 其赋给变量:
for var in ....; do
....
done
面例别打印ABC屏幕:
#!/bin/sh
for var in A B C ; do
echo "var is $var"
done
面更用脚本showrpm其功能打印些RPM包统计信息:
#!/bin/sh
# list a content summary of a number of RPM packages
# USAGE: showrpm rpmfile1 rpmfile2 ...
# EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
for rpmpackage in $*; do
if [ -r "$rpmpackage" ];then
echo "=============== $rpmpackage =============="
rpm -qi -p $rpmpackage
else
echo "ERROR: cannot read file $rpmpackage"
fi
done
现第二特殊变量$*该变量包含所输入命令行参数值
您运行showrpm openssh.rpm w3m.rpm webgrep.rpm
$* 包含 3 字符串即openssh.rpm, w3m.rpm and webgrep.rpm.
5. 引号
向程序传递任何参数前程序扩展通配符变量所谓扩展意思程序通配符(比*)替换合适文件名变量替换变量值防止程序作种替换您使用引号:让我看例假设前目录些文件两jpg文件 mail.jpg tux.jpg
1.2 编译SHELL脚本
#ch#!/bin/sh mod +x filename
cho *.jpg ∪缓螅梢酝ü淙耄?./filename 执行您脚本
打印"mail.jpg tux.jpg"结
引号 (单引号双引号) 防止种通配符扩展:
#!/bin/sh
echo "*.jpg"
echo '*.jpg'
打印"*.jpg" 两
单引号更严格些防止任何变量扩展双引号防止通配符扩展允许变量扩展
#!/bin/sh
echo $SHELL
echo "$SHELL"
echo '$SHELL'
运行结:
/bin/bash
/bin/bash
$SHELL
种防止种扩展使用转义字符——反斜杆:
echo /*.jpg
echo /$SHELL
输:
*.jpg
$SHELL
6. Here documents
要几行文字传递给命令here documents(译者注:目前没见该词适合翻译)种错每脚本写段帮助性文字用我四 here documents必用echo函数行行输 "Here document"
here document 段特殊目代码块. 使用I/O 重定向形式命令序列传递交互程序或者命令, 比ftp, cat, 或者ex文本编辑器.
1 COMMAND
limit string 用划定命令序列范围(译者注: 两相同limit string间命令序列). 特殊符号
here document 形式看:
1 #!/bin/bash
2 interactive-program
选择名字非诡异limit string避免命令列表limit string重名问题.
面例该例我文件进行重命名并且使用here documents打印帮助:
#!/bin/sh
# we have less than 3 arguments. Print the help text:
if [ $# -lt 3 ] ; then
cat
4)函数
您写些稍微复杂些程序您发现程序能几使用相同代码并且您发现我使用函数便函数:
functionname()
{
# inside the body $1 is the first argument given to the function
# $2 the second ...
body
}
您需要每程序始函数进行声明
面叫做xtitlebar脚本使用脚本您改变终端窗口名称
使用叫做help函数您看定义函数使用两
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat shift by 2
--) shift;break;; # end of options
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done
echo "opt_f is $opt_f"
echo "opt_l is $opt_l"
echo "first arg is $1"
echo "2nd arg is $2"
您运行该脚本:
cmdparser -l hello -f -- -somefile1 somefile2
返结:
opt_f is 1
opt_l is hello
first arg is -somefile1
2nd arg is somefile2
脚本何工作呢脚本首先所输入命令行参数进行循环输入参数与case表达式进行比较匹配则设置变量并且移除该参数根据unix系统惯例首先输入应该包含减号参数.
第2部 实例
现我讨论编写脚本般步骤任何优秀脚本都应该具帮助输入参数并且写伪脚本(framework.sh)该脚本包含数脚本都需要框架结构非错主意候写新脚本我需要执行copy命令:
cp framework.sh myscript
再插入自函数
让我再看两例:
(1) 二进制十进制转换
脚本 b2d 二进制数 (比 1101) 转换相应十进制数用expr命令进行数运算例:
#!/bin/sh
# vim: set sw=4 ts=4 et:
help()
{
cat
第3部:调试
简单调试命令使用echo命令您使用echo任何怀疑错打印任何变量值绝数shell程序员要花费80%间调试程序原Shell程序处于需要重新编译插入echo命令需要少间
shell真实调试模式脚本"strangescript" 错误您进行调试:
sh -x strangescript
执行该脚本并显示所变量值
shell需要执行脚本检查语模式使用:
sh -n your_script
返所语错误
调试shell程序程
用户刚编写完Shell程序避免错误我利用Bsh提供跟踪选项该选项显示刚刚执行命令及参数用户通set命令打-x选项或启Shell使用-x选项Shell设置跟踪模式例面代码ice_tx:
if [ $# -eq 0 ]
then
echo "usage:sumints integer list"
exit 1
fi
sum=0
until [ $# -eq 0 ]
do
sum='expr $sum + $1'
shift
done
echo $sum
我用跟踪模式运行:
$sh -x ice_tx 2 3 4
结显示:
+[ 3 -eq 0 ]
+sum=0
+[ 3 -eq 0 ]
+expr 0+2
+sum=2
+shift
+[ 2 -eq 0 ]
+expr 2+3
+sum=5
+shift
+[ 1 -eq 0 ]
+expr 5+4
+sum=9
+[ 0 -eq 0 ]
+echo 9
9
面看跟踪模式Shell显示执行每条命令及该命令使用变量替换参数值些控制字if、then、until等没显示