将命令的输出放到一个变量中
foo=$(command)会将command的输出赋值给foo
算数扩展 $(())
$(())比expr常用
例子
#!/bin/sh
x=0
while [ "$x" -ne 10 ];do
echo $x
x=$(($x+1))
done
exit 0
注意:这与x=$()命令不同,两对圆括号用于算术替换,而我们之前见到的一对圆括号用于命令的执行和获取输出。
参数扩展${}
for i in 1 2
do
echo ${i}_tmp
done
将会打印:
1_tmp
2_tmp
参数扩展格式
${param:-default}如果param为空,就将它设置为default
${#param}给出param的长度
${param%word}从param的尾部开始删除与word匹配的最小部分,返回返回剩余部分
${param%%word}从param的尾部开始删除与word匹配的最长部分,返回返回剩余部分
${param#word}从param的头部开始删除与word匹配的最小部分,返回返回剩余部分
${param##word}从param的头部开始删除与word匹配的最长部分,返回返回剩余部分
例子:
#!/bin/sh
unset foo
#if the foo is NULL,output bar,or output foo
echo ${foo:-bar}
# bar
foo=fud
echo ${foo:-bar}
#fud
foo=/usr/bin/X11/startx
echo ${foo#*/}
#usr/bin/X11/startx
echo ${foo##*/}
#startx
bar=/usr/local/etc/local/networks
echo ${bar%local*}
#/usr/local/etc/
echo ${bar%%local*}
#/usr/
foo=$(command)会将command的输出赋值给foo
算数扩展 $(())
$(())比expr常用
例子
#!/bin/sh
x=0
while [ "$x" -ne 10 ];do
echo $x
x=$(($x+1))
done
exit 0
注意:这与x=$()命令不同,两对圆括号用于算术替换,而我们之前见到的一对圆括号用于命令的执行和获取输出。
参数扩展${}
for i in 1 2
do
echo ${i}_tmp
done
将会打印:
1_tmp
2_tmp
参数扩展格式
${param:-default}如果param为空,就将它设置为default
${#param}给出param的长度
${param%word}从param的尾部开始删除与word匹配的最小部分,返回返回剩余部分
${param%%word}从param的尾部开始删除与word匹配的最长部分,返回返回剩余部分
${param#word}从param的头部开始删除与word匹配的最小部分,返回返回剩余部分
${param##word}从param的头部开始删除与word匹配的最长部分,返回返回剩余部分
例子:
#!/bin/sh
unset foo
#if the foo is NULL,output bar,or output foo
echo ${foo:-bar}
# bar
foo=fud
echo ${foo:-bar}
#fud
foo=/usr/bin/X11/startx
echo ${foo#*/}
#usr/bin/X11/startx
echo ${foo##*/}
#startx
bar=/usr/local/etc/local/networks
echo ${bar%local*}
#/usr/local/etc/
echo ${bar%%local*}
#/usr/
here文档
here文档的最常见的用户是输出大量的文本而不使用大量是使用echo
如:
#!/bin/sh
cat <<!FUNKY!
hello
this is a here
document
!FUNKY!
here文档以两个连续的小于号开始,紧接着一个特殊的字符序列,标记不能出现在文本中。
脚本程序调试:
命令行选项 | set选项 | 说明 |
sh -n <script> | set -o noexec set -n | 只检查语法错误,不执行命令 |
sh -v <script> | set -o verbose set -v | 在执行命令之前回显命令 |
sh -x <script> | set -o xtrace set -x | 在处理完命令之后回显命令 |
sh -u <script> | set -o nounset set -u | 如果使用了未定义的变量,就给出出错信息 |
dialog工具可以使shell具有图形化的属性。