shell 命令: 一些小技巧

  • 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)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值