建议用""括起变量
# 注释
转义符(Escape Character)
/b 退格键
/c 不换行
/n 换行LF
/r 回车CR
/t tab键
/0n n是数字,ascii字符
shell执行新命令时新建一个子进程,在子进程中执行
. ---- 在当前进程中执行
`` ---- 捕获命令输出
read 从用户输入读入
read var1 var2 var3,假如用户输入word1 word2 word3 word4,则:
$var1=word1
$var2=word2
$var3=word3 word4
变量:
赋值:var1="word1"
使用:echo "$var1"
去除:unset var1
命令行参数
$0 -- 命令名
$1,...,$9 -- 命令参数
$# -- 参数个数(不包括$0)
$@ -- 所有命令行参数$1,...,$9,...,但是每一个用""包围
$? -- 最后一个命令的退出状态
$* -- 所有命令行参数$1,...,$9,...
$$ -- 进程的id
set 设置$1,...,$9参数,如:set var1 var2,则:$1=var1 $2=var2
exit n 有状态退出(0--成功,其他失败)
条件语句:
if [ condition ] -- 注意"["后有一空格,"]"前有一空格
then
commands
fi
-------------------
if [ condition ]
then
commands
else
commands
fi
--------------------
if [ condition1 ]
then
commands
elif [ condition2 ]
then
commands
elif [ condition3 ]
then
commands
else
commands
fi
test命令 (数字,字符串,文件) 等价于 [ condition ] (0--success,otherwise--failure) man test
if test "$var" = value 等价于 if [ "$var" = value ] 注意: 比较符两侧都有一个空格,如: [ "$var1" = "$var2" ]
(1)数字
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
(2)字符串
= 等于
!= 不等
-n 是否非零长
-z 是否零长
(3)文件
-r 存在并可读?
-w 存在并可写?
-s 存在并非零长?
-f 存在并且是一个文件?
-d 存在并且是一个目录?
(4)逻辑操作符
-a and
-o or
! not
x=10
x=$x+1
echo $x 得出的是10+1,因为默认为字符串连接
expr命令
x=10
x=`expr $x+1`
echo $x 得出11
其他示例:expr 10 /* 2 (注意:*要转义)
比较操作: = != < <= > >=
expr表达式为真,返回1;为假,返回0
let命令 等价于 (( command )) -- 注意空格
x=100
let x=x+1
echo $x 得出101 (注意:let中可以直接使用* %,不用转义)
循环语句:
for var
in list of vars
do
commands
done
while [ condition ]
do
commands
done
until [ condition ] -- 为假时进入循环
do
commands
done
shell的debug:
a脚本为:
echo "haha"
echo "$0 $1"
echo $#
echo $$
bash -x 显示命令(参数已替换和执行结果)
bash -x a 则,输出:
+ echo haha
haha
+ echo 'a '
a
+ echo 0
0
+ echo 10877
10877
其中带+为命令,其余为输出
bash -v 显示命令(参数未替换和执行结果)
bash -v a 则,输出:
echo "haha"
haha
echo "$0 $1"
a
echo $#
0
echo $$
10878
bash -n 不执行,只读取命令,可以查错
参数替换
$var var变量值
${var} var变量值[例:x=10 echo $x ${x}y 打印出10 10y]
${var:-string} 如果var设置并且不为空,取$var;否则,取string
${var:+string} 如果var设置并且不为空,取string;否则,nothing happened
${var:=string} 如果var设置并且不为空,取$var;否则,$var=string
${var:?string} 如果var设置并且不为空,取$var;否则,打印出string,并退出
转义字符
/ 后的字符为原本字符,如://
" " 中的字符为literal(除 $ ` " 外)
' ' 中的字符为literal(除 ' 外)
例如:xyz=110
echo $xyz "$xyz" '$xyz'
输出110 110 $xyz
shell中元字符
` 执行命令
; 多条命令
() 分组命令
& 后台运行命令
| 管道操作符(一个命令的输出用于另一个命令的输入)
. 当前进程执行命令
> 重定向输出
< 重定向输入
>> 重定向附加
: 空命令,没有效用,始终返回0(真)
~/ 代表当前用户的家目录
~haha/ 代表用户haha的家目录
wildcard字符
* 0或多个字符
? 1个字符
[a-z] a-z范围
[!ab] 除了ab
trap命令(设置信号)
trap "option command" signal number
例:trap "echo i don't want to die" 15
trap " " 15 -- 忽略信号15
trap 15 -- 重置信号
stty命令(设置终端,具体可man stty)
stty
stty -a 显示所有选项
例如:开启 stty 选项名 关闭 stty -选项名
几个重要的选项:
echo 是否回显键入的字符
raw 关闭元字符的意义
intr 产生中断信号的键
erase 删除前一个字符的键
kill 删除一行的键
eof 文件结束信号的键
ek 重置erase和kill键
sane 设置终端字符到合理的默认值
例:stty kill /^U kill用键[ctrl-u]
stty sane 恢复默认
tput命令(设置终端的能力)
终端数据库terminfo文件
tput [-Ttype] init
tput [-Ttype] reset
tput [-Ttype] capability-name
能力选项
bel 回显终端的铃声类型
blink 闪烁
bold 粗体
clear 清屏
cup r c 移动光标到r行c列
dim
ed 从当前光标清除到屏幕的最后
el 从当前光标清除到行最后
smso bold=`tput smso`粗体
rmso offbold=`tput rmso`取消粗体
smul 开始下划线模式
rmul 结束下划线模式
rev 反显
sgr0 关闭所有属性
例:
tput clear
tput cup 10 20
tput blink
tput smul
tput rmul
bell=`tput bel`
case结构
case var in
pattern_1) command1 ;;
pattern_2) command2 ;;
...
...
*) default_command ;;
esac
pattern可以是这样的形式:0? | 1[0-1],前半部分0?代表00-09,后半部分1[0-1]代表10,11,|为或操作符
循环重定向
假设一个文件TEMP以:分隔,字段为title,author
IFS=":"
while read title author
do
......
done < TEMP