if 判断后面的返回值,不论后面是test 还是其他什么,返回值是0 就成立. 同理,while 后面也可以跟test. if test …; then … fi while test …; do … done
less cat set 等等命令后面,可以跟 ‘–’ 的参数,表示后面不再有参数了. 如果文件名是 ‘-abc’,cat -abc 会被解释为参数,用 cat – -abc 就会当做文件名
set 是很好用的函数,set – $(echo “a b c”),会把内置变量\$1 改成a,\$2 改成b,\$3 改成c
sh -x test.sh 用于调试脚本
cat … | while read line; do … done 或者 while read line; do … done < cat …
一个用来锁定终端的脚本
#!/bin/bash
trap '' 1 2 3 20 # trap 命令捕获这些幸好,防止用户通过ctrl-c ctrl-z 终止脚本
stty -echo # 终端不回显
read -p "key: " key_1
echo
read -p "again: " key_2
echo
key_3=''
if test "$key_1" == "$key_2"
then
tput clear # 清屏幕
until test "$key_3" == "$key_2"
do
read key_3
done
else
echo "key not match,not locked" 1>&2
fi
stty echo
echo -n “abc” 不换行 echo -e “abc\n” 会把\n 转换成换行 -e 选项会解释转义字符,用双引号”\n” 就不会被shell 解释,但会被echo -e 解释
cd
(dirname$0)强制脚本cd到执行脚本所在的目录.echo (basename $0) 脚本名Here 文档,这是个很好玩的东西,脚本搜索脚本本身
# sh find.sh 123
grep -i "$1" <<+
abc 123
def 456
ghi 789
+
文件描述符: 0 表示标准输入,1 表示标准输出,2 表示标准错误. 重定向: echo abc > /dev/null 2>&1 ; 标准错误写入标准输出,标准输出写入/dev/null
Linux 里面的过滤器,我特别喜欢tr,可以用来做替换,也可用来删除. tr -d ‘\r’ 把windows 的行结束符换成unix 的结束符. sed 也可以写,但是没有tr 简短.
下面这段是网上找的,很有用
$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1..9
$* 这个程式的所有参数,此选项参数可超过9个
$@ 跟$*类似,但是可以当作数组用
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
上面 $* 和 $@ 可以一样用,但是加上双引号的时候就不一样了,“$*” 是一个参数,“$@” 是多个参数
- 还有一个厉害的写法,也是网上找的
假设我们定义了一个变量为:
file=/dir1/dir2/dir3/my.file.txt
可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个/及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个/及其左边的字符串:my.file.txt
${file#*.}:删掉第一个.及其左边的字符串:file.txt
${file##*.}:删掉最后一个.及其左边的字符串:txt
${file%/*}:删掉最后一个/及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个/及其右边的字符串: ${file%.*}:删掉最后一个.及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个.及其右边的字符串:/dir1/dir2/dir3/my 记忆的方法为: # 是去掉左边(键盘上#在 $ 的左边) % 是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的0~5个字符/dir1
${file:5:5}: 从第5个字符开始,提取5个字符 /dir2,这个跟cut -c 5-10 效果一样
自定义文件描述符: exec 123> abc.txt; echo abc >& 123; 就会把abc 追加到abc.txt 文件末尾. 注意是追加,没有覆盖.
pwdx pid 可以打印进程的执行文件路径
xargs 是非常强的命令,常用写法: ls * | xargs -I {} cp {} {}.bk
怎样反序输出一个文件: 可以用tac 命令,就是cat 反过来. 也可以用 sed -n ‘1!G;h;$p’ 命令. 这里要解释一下各个命令的含义:
g: 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
G: 将hold space中的内容append到pattern space\n后
h: 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
H: 将pattern space中的内容append到hold space\n后
x: 交换pattern space和hold space的内容
sed 常用技巧: [coolshell](http://coolshell.cn/articles/9104.html)