Shell脚本学习
1、Shell简介
Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本
Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell
Shell脚本文件的扩展名为.sh
(sh代表shell)
2、第一个Shell程序
#!/bin/bash echo "hello word!"
命令行运行:
chmod +x test.sh ./test.sh
#!
是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell
以#
开头的行就是注释,会被解释器忽略,sh里没有多行注释
3、echo/printf/read
echo使用:
echo:是Shell的一个内部指令,用于在屏幕上打印出指定的字符串
echo arg #输出arg变量 echo -e arg #执行arg里的转义字符。echo加了-e默认会换行 echo arg > myfile #显示结果重定向至文件,会生成myfile文件
注意:
echo后单引号和双引号作用是不同的
单引号不能转义里面的字符,双引号可有可无,单引号主要用在原样输出中
printf使用:
printf
命令用于格式化输出, 是echo
命令的增强版
printf
不像 echo
那样会自动换行,必须显式添加换行符(\n)
printf
由 POSIX 标准所定义,移植性要比 echo
好
printf 命令的语法:
printf format-string [arguments...] #format-string 为格式控制字符串,arguments 为参数列表。功能和用法与c语言的 printf 命令类似。
说明:
- printf 命令不用加括号
- format-string 可以没有引号,但最好加上,单引号双引号均可
- 参数比格式控制符(%)多时,格式控制符可以重用,可以将所有参数都转换
- arguments 使用空格分隔,不用逗号
# 1.双引号 printf "%d %s\n" 10 "abc" 10 abc # 2.单引号与双引号效果一样 printf '%d %s\n' 10 "abc" 10 abc # 3.没有引号也可以输出 printf %s abc abc # 但是下面的会出错: printf %d %s 10 abc # 因为系统分不清楚哪个是参数,这时候最好加引号了。 # 4.格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用 $ printf %s a b c abc $ printf "%s\n" a b c a b c # 5.如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替 $ printf "%s and %d \n" and 0 # 6.如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0 $ printf "The first program always prints'%s,%d\n'" Hello Shell -bash: printf: Shell: invalid number The first program always prints 'Hello,0' $
read使用:
命令行从输入设备读入内容
#!/bin/bash echo "What is your name?" read NAME #输入 echo "Hello, $NAME"
4、变量
变量定义及使用
Shell支持自定义变量
定义变量:变量名不加美元符号($)
variableName="value"
注意:
变量名和等号之间不能有空格,有空格会出错
如果手误写错(例如 var = test
),刚好要使用rm -rf $var/
删除这个目录,实际删除的是/
变量名的命名须遵循如下规则:
- 首个字符必须为字母(a-z,A-Z)
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
使用变量:在变量名前面加美元符号($)即可
your_name="ll" echo $your_name echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
for skill in C PHP Python Java do echo "I am good at ${skill}Script" done
如果不给skill变量加花括号,写成echo "I am good at $skillScript"
,解释器就会把$skillScript
当成一个变量(其值为空),所以推荐给所有变量加上花括号
已定义的变量,可以被重新定义
url="http://www.baidu.com" readonly url url="http://www.baidu.com"
注:readonly
命令可以将变量定义为只读变量,只读变量的值不能被改变
使用 unset
命令可以删除变量:
unset variable_name
说明:变量被删除后不能再次使用,unset 命令不能删除只读变量
变量类型
三种变量:
- 局部变量 :局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 :所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 :shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行。
特殊变量
变量 | 含义 |
$0 |
当前脚本的文件名 |
$n |
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1 ,第二个参数是$2 。 |
$# |
传递给脚本或函数的参数个数。 |
$* |
传递给脚本或函数的所有参数。 |
$@ |
传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同 |
$? |
上个命令的退出状态,或函数的返回值。 |
$$ |
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
$*
和 $@
的区别:
$*
和 $@
都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n"
的形式输出所有参数。
但是当它们被双引号(" “)包含时,”$*
" 会将所有的参数作为一个整体,以"$1 $2 … $n
"的形式输出所有参数;“$@
” 会将各个参数分开,以"$1" "$2" … "$n"
的形式输出所有参数。
echo "print each param from \"\$*\"" for var in "$*" do echo "$var" done echo "print each param from \"\$@\"" for var in "$@" do echo "$var" done
print each param from "$*" a b c d print each param from "$@" a b c d
5、转义字符
转义字符 含义 \\ 反斜杠 \a 警报,响铃 \b 退格(删除键) \f 换页(FF),将当前位置移到下页开头 \n 换行 \r 回车 \t 水平制表符(tab键) \v 垂直制表符
shell默认是不转义上面的字符的,需要加-e
选项:
#!/bin/bash a=11 echo "a is $a \n" echo -e "a is $a \n"
6、命令替换
变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。
可以使用的变量替换形式:
形式 | 说明 |
${var} |
变量本来的值 |
${var:-word} |
如果变量 var 为空或已被删除(unset),那么返回 word,但不改变 var 的值。 |
${var:=word} |
如果变量 var 为空或已被删除(unset),那么返回 word,并将 var 的值设置为 word。 |
${var:?message} |
如果变量 var 为空或已被删除(unset),那么将消息 message 送到标准错误输出,可以用来检测变量 var 是否可以被正常赋值。若此替换出现在Shell脚本中,那么脚本将停止运行。 |
${var:+word} |
如果变量 var 被定义,那么返回 word,但不改变 var 的值。 |
7、Shell脚本样例
下面的脚本用于php安装过程中安装zip扩展:
#!/bin/bash #zip install if [ -d php-5.4.25/ext/zip ];then cd php-5.4.25/ext/zip else tar zxvf php-5.4.25.tar.gz cd php-5.4.25/ext/zip fi /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make [ $? != 0 ] && exit make install echo grep 'no-debug-zts-20100525' /usr/local/php/etc/php.ini if [ $? != 0 ];then echo '' >> /usr/local/php/etc/php.ini echo 'extension_dir=/usr/local/php/lib/php/extensions/no-debug-zts-20100525' >> /usr/local/php/etc/php.ini fi grep 'zip.so' /usr/local/php/etc/php.ini if [ $? != 0 ];then echo 'extension=zip.so' >> /usr/local/php/etc/php.ini fi echo "zip install is OK" /usr/local/apache2/bin/apachectl restart cd - rm -rf php-5.4.25 echo "all ok!" ls /usr/local/php/lib/php/extensions/no-debug-zts-20100525/