示例均来自网络,附带有原始链接地址,自己练习整理发出,均测试可用
linux shell 基本语法 - 周学伟 - 博客园
https://www.cnblogs.com/zxouxuewei/p/6393092.html
变量声明和赋值
定义变量,等号左右不要有空格
通过export 变成全局变量
#!/bin/bash #a.sh a=666 b=hello g_user=root export g_user#全局变量 echo $a echo $b echo $g_user #调用 bash a.sh
把命令结果赋值给变量
- 圆括号
current_date=$(date) echo current data is [$current_date]
- 用反引号,和键盘上的波浪符号一个键(仅参考,使用1即可)
current_date=`date` echo current data is [$current_date]
- 花括号加反引号(仅参考,使用1即可)
current_date={`date`} echo current data is [$current_date]
if条件判断
#!/bin/bash #a.sh if [[ $1 == 1 ]]; then echo "first argument is 1" else echo "first argument is not 1" fi #调用 bash a.sh 1
case分支判断
#!/bin/bash #a.sh case $1 in 1) echo "the case is 1" ;; 2) echo "the case is 2" ;; 3) echo "the case is 3" ;; 4) echo "the case is 4" ;; *) echo "no case match first argument" ;; esac #调用 bash a.sh 2
for循环语句
形式一
#!/bin/bash #a.sh for (( i = 0; i < 10; i++ )); do echo "current value is $i" done #调用 bash a.sh
形式2
#!/bin/bash #a.sh for i in 1 2 3 4 5; do echo "current value is $i" done #调用 bash a.sh
while循环
#!/bin/bash #a.sh i=$1 while [[ $i > 0 ]]; do echo "now i's value is $i" let "i=i-1" done #调用 bash a.sh 10
函数
shell自定义函数 - 立志做一个好的程序员 - 博客园
https://www.cnblogs.com/oxspirt/p/7246075.html
- 1、必须在调用函数地方之前,声明函数,shell脚本是逐行运行。不会像其它语言一样先预编译。一次必须在使用函数前先声明函数。
- 2、
total=$(fSum 3 2)
; 通过这种调用方法,我们清楚知道,在shell 中 单括号里面,可以是:
命令语句。 因此,我们可以将shell中函数,看作是定义一个新的命令,它是命令,因此各个输入参数直接用空格分隔,命令里面获得参数方法可以通过:\(0…\)n得到。 $0代表函数本身。 - 3、函数返回值,只能通过
$?
系统变量获得,直接通过=
获得是空值。其实,我们按照上面一条理解,知道函数是一个命令,在shell获得命令返回值,都需要通过$?
获得。 - 4.可以带function fun()定义,也可以直接fun() 定义,不带任何参数。
- 5.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
#!/bin/bash #a.sh function add() { echo "arg1 is $1,arg2 is $2" return $(($1+$2)) } plus() { echo "arg1 is $1,arg2 is $2" return $(($1*$2)) } value=$(add $1 $2); echo "[echo value:$value,function add value:$?]" value=$(plus $1 $2); echo "[echo value:$value,function plus value:$?]" #调用 bash a.sh 5 7
数组
#!/bin/bash #a.sh name=(a bbb c d e f g) #数组 length=${#name[@]} #获取数组长度 echo length1:${#name[@]} #获取数组长度 echo length2:${#name[*]} #获取数组长度 echo length3:${#name[1]} #取得数组单个元素的长度 for (( i = 0; i < $length; i++ )); do echo value $i=${name[$i]} #读取数组的值 done #调用 bash a.sh
I/O
Shell中重定向的深入讲解_linux shell_脚本之家
https://www.jb51.net/article/142918.htm
> 输出重定向,覆盖方式 >> 输出重定向,追加方式 < 输入重定向 << 标准输入来自命令行的一对分隔号的中间内容
实例
#生成 input.txt cat <<EOF>input.txt zhao qian sun li zhou wu zheng wang EOF #将input.txt文件作为sort命令的输入 sort < input.txt # 将排序后的结果输出到input.sort.txt文件中 sort < input.txt >input.sort.txt # 将排序后的结果追加输出到input.txt文件中 sort < input.txt >> input.txt #将标准输入重定向为input.txt文件,标准输出重定向为input2.txt文件(追加),将标准错误重定向为error文件 sort 0< input.txt 1>> input2.txt 2> input.error.txt
一个程序的的输入可以来自于键盘,也可以来自于文件或者其他设备;同样的,一个程序也可以将输出显示在屏幕或者保存到文件中。这就涉及到标准输入、标准输出和标准错误。
程序的输入是标准输入,默认是键盘,用户可以将其指定为文件或其他设备。
程序的输出有两种,即标准输出和标准错误,其中标准输出是程序的正常输出、标准错误是程序的错误输出。二者默认都被指定为屏幕,用户可以将其指定为文件或其他设备。
每个输入源和输出地都有一个描述符,标准输入的描述符为0,标准输出的描述符为1,标准错误的描述符为2。
EOF
linux下EOF写法梳理 - 散尽浮华 - 博客园
https://www.cnblogs.com/kevingrace/p/6257490.html
执行脚本的时候,需要往一个文件里自动输入N行内容。如果是少数的几行内容,还可以用echo追加方式,但如果是很多行,那么单纯用echo追加的方式就显得愚蠢之极了!
这个时候,就可以使用EOF结合cat命令进行行内容的追加了。
EOF是END Of File的缩写,表示自定义终止符.既然自定义,那么EOF就不是固定的,可以随意设置别名,在linux按ctrl-d就代表EOF.
EOF一般会配合cat能够多行文本输出.
#把EOF的内容作为cat 的输入 cat <<EOF aaa bbb ccc EOF #把EOF的内容作为cat 的输入,并把cat的输出定向到a.txt cat <<EOF > a.txt aaa bbb ccc EOF
getopts
获取参数定义
#!/bin/bash #a.sh while getopts "a:b:c:r:" arg; do case $arg in a) a=$OPTARG ;; b) b=$OPTARG ;; c) c=$OPTARG ;; r) repo=$OPTARG ;; ?) echo you need help ;; esac done echo "a:$a,b:$b,c:$c,repo:$repo" #调用 bash a.sh -a 3 -b 4 -c 5 -r 6