高级Bash脚本编程指南笔记
最近在补Linux的实验楼,不会的太多了,所以我又来了:p。网址:高级Bash脚本编程指南
入门
vim编写*.sh即可
编写
- 代码头需要添加
#!/bin/bash
,表示由/bin目录下的bash解释执行
运行
- bash *.sh
- sh *.sh
- . .*.sh
重定向
-
echo "Hello" > my.txt
直接新建保存文本 -
可将地址作为变量(调用时需要加$),并将linux作为代码的一部分
例:
#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR
cat /dev/null > wtmp
echo "Logs cleaned up."
exit
PS:/dev/null为空,可配合cat与重定向清除文件内容
bash特殊字符
-
# 注释
-
; 分隔命令(压行压行压行);比如这样;也可以用来终止case;;酱
-
“双引号”与’单引号‘ 双引号会解释部分特殊字符,单引号则不解释
例:
> HOME='shiyanlou' > echo $HOME shiyanlou > echo "$HOME" #解释为变量 shiyanlou > echo '$HOME' #作字符 $HOME
-
` 优先执行
例:
cp `mkdir back` test.sh back
会先mkdir back创建back目录,再cp test.sh back将test.sh放入back目录中 -
: 与True等价|占位符|: >
清空|:>>创建新文件|不关闭错误检查的注释|分隔符 -
? 三元运算符
-
$ 变量
-
() 子shell|开数组
例:arr=(1 4 5 7 9 21) echo ${arr[3]}
-
{} 文件名扩展|代码块(匿名内建函数)
例:cp t.{txt,back}
-
[] 条件表达式,[[ ]]可直接判断
-
> 创建&覆盖
>> 创建&追加
-
| 管道,前输出传入后输入
例: test.sh作用为小写转大写,
ls -l| ./test.sh
可打印大写文件名 -
- 加参数
例: if ["$a" -eq "$b"]比较是否相等(equal to),还有-lt(less than)与-gt(greater than)
-
~ 表示HOME
变量和参数
- 使用
readonly <var>
定义只读变量 - 位置参数$0,$1……,$9,${10},${11},$0为文件名。还有一些特殊用法,如$#:传递到脚本的参数个数, $*:以一个单字符串显示所有向脚本传递的参数。
基本运算符
-
bash不支持原生运算,可通过expr实现
-
算数运算符
符号间需要加入充分的空格,特殊符号如*需要*
-
关系运算符
-e相等n不g大l小
-
字符串运算符
=等 !=不等 -z为0 -n不为0 str为空
流程控制
bash的流程控制很骚,结束字符就是开始字符的反向。比如if-fi,case-esac
语句与python啥的大同小异,不过是if-then-elif-else-fi这样的结构,个人觉得更合理一些,上几串代码算了
a=10
b=20
if [ $a == $b ]
then
echo "a == b"
elif [ $a -gt $b ]
then
echo "a > b"
elif [ $a -lt $b ]
then
echo "a < b"
else
echo "Ineligible"
fi
PS:可不是水o,先培养下写博客记录和敲字的习惯(逃
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
while(( $int<=5 ))
do
echo $int
let "int++"
done
read aNum
case $aNum in
1) echo 'You have chosen 1'
;;
2) echo 'You have chosen 2'
;;
3) echo 'You have chosen 3'
;;
4) echo 'You have chosen 4'
;;
*) echo 'You did not enter a number between 1 and 4'
;;
esac
break,continue啥的都一样
函数
#!/bin/bash
funWithReturn(){
echo "This function will add the two numbers of the input..."
echo "Enter the first number: "
read aNum
echo "Enter the second number: "
read anotherNum
echo "The two numbers are $aNum and $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "The sum of the two numbers entered is $? !"
值得注意的是调用函数后用$?获得返回值
后记:虽然bash很简单,但还是花了一段时间。爱了就爱了以前常说:不怕走就怕停。应当铭记