只是一些适当的抛砖,未做深入讨论,不足以当做教程,想完整学习的看官请查阅权威资料!
cd -
返回上一次进入的目录。等价于cd $OLDPWD
。
如果你是刚进入终端界面,就不存在上一次的目录,那么执行这个命令将报错:cd: OLDPWD not set
。除非你至少执行过一次cd操作
!!
执行上一条命令。
echo '原罪'!!
你会看到两个原罪
如果你有一个命令少打了个什么单词,那么这个功能实在是方便:
原罪大sbecho !!
history
查看你之前执行过的命令。
$?
查看上一个执行的命令的状态。默认值是0,也就是说没报错。
有一个用处就是你可以用来判断是否要继续往下执行if [ "$?" -ne 0 ]then echo "Error and exix" exit $?fi
如果你的程序容不得半点错误,而且几乎每一步你都需要判断有没有报错,那么改一下模式就好了:
# 设置模式,一旦进程或者子进程返回的状态不是0,那么就直接退出set -e# 开始执行代码
test
这是一个内置的检验函数,简写是:[ expression ]
,也就是我们常在if
中使用的
a=2test $a -eq 2echo $?# 0 测试正确test $a -eq 3echo $?# 1 测试错误if [ $a -eq 2 ]then # of coursefi
pwd -P
查看当前所在目录,意味着软链接
的目录将显示真实的路径
reboot
重启电脑。危险操作,慎用
reboot# 如果没有权限sudo reboot
set -x
打印出执行的命令,并在命令前加上+号
# vi test.shset -x me="Who am i"echo ${#me}
sh test.sh# + me='Who am i'# + echo 8# 8
: > FILE
置空文件内容并保存。
:
其实是个空操作,可以单独使用 if xxxthen :else # run fi
shift
从左侧开始删除位置参数
# 模拟位置参数set aa bb ccecho $@# aa bb ccshiftecho $@# bb ccshiftecho $@# cc
CDPATH
和PATH类似,但这个变量是给cd用的。
你想cd进一个目录,但是这个目录不在当前工作目录,那么shell就会去CDPATH的路径下找# PhpstormProjects目录下有一个 user-api 目录CDPATH=$CDPATH:$HOME/PhpstormProjects/# 当前目录:$HOMEcd user-api# 当前目录:$HOME/PhpstormProjects/user-api
CDPATH可以放在.bash_profile中
2>&1
输出重定向,将标准错误重定向为标准输出
一些logs输出其实是走的标准错误输出的,所以你想用管道之类的做额外处理的话,十分抱歉。# 想查看最后一行的log# 抱歉。这样无法通过管道,直接全部打印出来了docker logs some-container | tail -1# 好的。管道正式开放docker logs some-container 2>&1 | tail -1
有时候,你想捕获错误信息,并使用他,或者存入变量,那么也可以使用输出重定向。
注意:2>&1 中间不能有空格哦
dirname $0
在shell执行脚本文件中,精确的找到当前文件所在的目录。
# file.shcurrent_dir=$(dirname $0)
cal
快速查看日历
# 查看当前月的日历cal 十月 2018 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 # 查看9月日历cal 9 2018 九月 2018 日 一 二 三 四 五 六 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 # 查看一年12个月的日历cal 2018
cat > FILE <<
利用行内输入重定向把内容写入文件。在做一些自动化脚本的时候比较有用,兼顾了格式化和可读性。
这种写法也叫做here document
cat > test.txt <
好的,test.txt中已经写入了相关文字,格式一致。不信你就cat test.txt
试试。
网上经常看到一些教程,先vi file,然后把某段内容复制进去,然后:wq一下。我去,哪有那么多时间理你啊。现在,你可以这么说:把这段执行一下即可!
grep -v grep
这个看官可能想找某个正在运行的进程
ps aux | grep nginx
细心的你会发现,不管有没有找到nginx相关的进程,都会显示一个进程
fwh1990 1134 0.0 0.0 4268060 828 s002 S+ 3:52下午 0:00.00 grep nginx
我们略施小计即可去除这种无用进程
ps aux | grep nginx | grep -v grep
好的,还你一个清爽的输出。
readonly
设置一个只读变量。意味着不能再修改了,修改会报错呦。
readonly me='原罪'# 打印原罪echo $me# 立刻报错me='小弟'# -bash: me: readonly variable
array[*]
shell是有数组的
arr[0]='你好'arr[1]='原罪'arr[2]='哥'echo ${arr[0]} # 你好echo ${arr[2]} # 哥echo $arr# 你好 等价于 ${arr[0]}echo ${arr[*]}# 你好 原罪 哥 全部打印
字符串也可以转换成数组
arr='你好 原罪 哥'arr=($arr)echo ${arr[1]}# 原罪
${parameter:?}
要求参数必须填,否则报错。去除繁琐的if判断。
# vi test.shecho ${1:?}#shell:sh test.sh# test.sh: line 1: 1: parameter null or not set
当然了,也可以设置报错内容${parameter:?error_value}
unset
是的,shell变量也可以删除(包括函数)
# 变量aa=123echo $aa# 123unset aaecho $aa#
# 函数testMe () { echo 'done'}testMe# doneunset testMetestMe#
ssh-copy-id USER@IP
这是一个mac下的命令,就是把公钥立即部署到服务器对应用户的 ~/.ssh/authoried_keys 文件中。身边的朋友都觉得这个命令挺实用的!