参考书籍 Linux shell 脚本攻略
目录
- 使用别名
- 获取终端信息
- 获取、设置日期和延时
- 调试脚本
- 函数和参数
- 字段分隔符和迭代器
- 比较和测试
使用别名
- 使用
alias
命令,作用只是暂时的,一旦关闭当前终端,所有设置过的别名就会失效。为了使别名一直保持作用,可以将其放入~/.bashrc
文件中。
$ alias new_command='command sequence'
- 删除别名
unalias
- 对别名进行转义,忽略当前定义过的所有别名
$ \command
获取终端信息
tput以及stty终端工具
- 获取终端的行数和列数
tput cols
tput lines
- 打印当前终端名
tput longname
- 将光标移动到方位(x,y)处
tput cup $x $y
- 设置终端背景色,no可以在0-7之间取值
tput setb no
- 设置终端前景色
tput setf no
- 设置文本样式为粗体
tput bold
- 设置下划线的开闭
tput smu1
tput rmu1
- 删除当前光标位置到行尾的所有内容
tput ed
获取、设置日期和延时
- 读取日期
$ date
调试脚本
Bash本身包含了一些选项能够打印出脚本接受的参数和输入。
- 使用
-x
选项,启动跟踪调试shell脚本,能够打印出所执行的每一行命令以及当前状态。也可以使用sh -x script.sh
。
$ bash -x script.sh
- set -x:在执行时显示参数和命令
- set +x:禁止调试
- set -v:当命令进行读取时显示输入
- set +v:禁止打印输入
- 文件头从
#!/bin/bash
改成#!/bin/bash -xv
,不用任何其他选项就可以启动调试功能。
函数和参数
定义函数
function fname()
{
statements;
}
fname()
{
statements;
}
只需要使用函数名就可以调用某个函数
$ fname ;#执行函数
$ fname arg1 arg2; #传递参数
- $1是第一个参数
- $2是第二个参数
- $n是第n个参数
-
$@
被扩展为"$1" "$2" "$3"
等 -
$*
被扩展为"$1c$2c$3"
,其中c是IFS的第一个字符。 -
$@
用的最多。由于$*
将所有的参数当做单个字符串。
字段分隔符和迭代器
内部字段分隔符(IFS,Internal Field Separator)是shell脚本的一个重要概念。
data="name,sex,rollno,location"
oldIFS=$IFS
IFS=,
for item in $data;
do
echo Item: $item
done
IFS=$oldIFS
- for 循环
for var in list;
do
commands;
done
生成序列
echo {1.. 50}
echo {a.. z}
for循环也可以采用c语言中for循环的格式
for((i=0;i<10;i++))
{
commands;
}
- while循环
while condition
do
commands;
done
- until循环:会一直循环直到给定的条件为真
x=0
until [ $x -eq 9 ];
do let x++; echo $x;
done
比较和测试
- if条件
if condition;
then
commands;
fi
- if else if和else
if condition;
then
commands;
elif condition;
then
commands
else
commands
fi
算术比较
条件通常放在封闭的中括号内,注意在[
或]
与操作数之间有一个空格,否则会报错
[ $var -eq 0 ]
[ $var -ne 0 ]
-
-gt
大于 -
-lt
小于 -
-ge
大于等于 -
-le
小于等于 -
-a
逻辑与 `[ var1 -ne 0 -a $ var2 -gt 2 ] -
-o
逻辑或
文件系统相关测试
-
[ -f $file_var ]
:如果给定的变量包含正常的文件路径或文件名,则返回真。 -
[ -x $var ]
: 如果给定的变量包含的文件可执行,则返回真。 -
[ -d $var ]
: 如果给定的变量包含的是目录,则返回真。 -
[ -e $var ]
: 如果给定的变量包含的文件存在,则返回真。 -
[ -c $var ]
: 如果给定的变量包含的是一个字符设备文件的路径,则返回真。 -
[ -b $var ]
: 如果给定的变量包含的是一个快设备文件的路径,则返回真。 -
[ -w $var ]
: 如果给定的变量包含的文件可写,则返回真。 -
[ -r $var ]
:如果给定的变量包含的文件可读,则返回真。 -
[ -L $var ]
: 如果给定的变量包含的是一个符号链接,则返回真。
字符串比较
使用字符串比较时,最好用双中括号因为有时候采用单中括号会产生错误。
[[ $str1 = $str2 ]]
[[ $str1 == $str2 ]]
[[ $str1 != $str2 ]]
[[ $str1 > $str2 ]]
[[ $str1 < $str2 ]]
[[ -z $str1 ]] # 空字符串则返回真
[[ -n $str1 ]] #非空字符串,则返回真。