linux_shell_引入外部脚本
3. shell语法——引入外部脚本类似于C/C++中的include操作,bash也可以引入其他文件中的代码。
语法格式:
12345. filename # 注意点和文件名之间有一个空格或source filename
示例创建test1.sh,内容为:
12#! /bin/bashname=yxc # 定义变量name
然后创建test2.sh,内容为:
12345! /bin/bashsource test1.sh # 或 . test1.shecho My name is: $name # 可以使用test1.sh中的变量
执行命令:
123acs@9e0ebfcd82d7:~$ chmod +x test2.sh acs@9e0ebfcd82d7:~$ ./test2.sh My name is: yxc
linux_shell_循环语句
3. shell语法——循环语句for…in…do…done命令格式:
123456for var in val1 val2 val3do 语句1 语句2 ...done
示例1,输出a 2 cc,每个元素一行:
1234for i in a 2 ccdo echo $idone
示例2,输出当前路径下的所有文件名,每个文件名一行:
1234for file in `ls`do echo $filedone
示例3,输出1-10
1234for i in $(seq 1 10)do echo $idone
示例4,使用{1..10} 或者 {a..z}
1234for i in {a..z}do echo $idone
for ((…;…;…)) do…done命令格式:
12345for ((expression; condition; expression))do 语句1 语句2done
示例,输出1-10,每个数占一行:
1234for ((i=1; i<=10; i++))do ...
linux_shell_文件重定向
3. shell语法——文件重定向每个进程默认打开3个文件描述符:
stdin标准输入,从命令行读取数据,文件描述符为0
stdout标准输出,向命令行输出数据,文件描述符为1
stderr标准错误输出,向命令行输出数据,文件描述符为2
可以用文件重定向将这三个文件重定向到其他文件中。
重定向命令列表
命令
说明
command > file
将stdout重定向到file中
command < file
将stdin重定向到file中
command >> file
将stdout以追加方式重定向到file中
command n> file
将文件描述符n重定向到file中
command n>> file
将文件描述符n以追加方式重定向到file中
输入和输出重定向
123456echo -e "Hello \c" > output.txt # 将stdout重定向到output.txt中echo "World" >> output.txt # ...
linux_shell_数组
3. shell语法——数组数组中可以存放多个不同类型的值,只支持一维数组,初始化时不需要指明数组大小。数组下标从0开始。
定义数组用小括号表示,元素之间用空格隔开。例如:
1array=(1 abc "def" yxc)
也可以直接定义数组中某个元素的值:
1234array[0]=1array[1]=abcarray[2]="def"array[3]=yxc
读取数组中某个元素的值格式:
1${array[index]}
例如:
12345array=(1 abc "def" yxc)echo ${array[0]}echo ${array[1]}echo ${array[2]}echo ${array[3]}
读取整个数组格式:
12${array[@]} # 第一种写法${array[*]} # 第二种写法
例如:
1234array=(1 abc " ...
linux_shell_判断语句
3. shell语法——判断语句if…then形式类似于C/C++中的if-else语句。
单层if命令格式:
123456if conditionthen 语句1 语句2 ...fi
示例:
1234567a=3b=4if [ "$a" -lt "$b" ] && [ "$a" -gt 2 ]then echo ${a}在范围内fi
输出结果:
13在范围内
单层if-else命令格式
12345678910if conditionthen 语句1 语句2 ...else 语句1 语句2 ...fi
示例:
12345678910a=3b=4if ! [ "$a" -lt "$b" ]then echo ${a}不小于${b}else echo ${a}小于${b}fi
输出结果:
...
linux_shell_默认变量
3. shell语法——默认变量文件参数变量在执行shell脚本时,可以向脚本传递参数。$1是第一个参数,$2是第二个参数,以此类推。特殊的,$0是文件名(包含路径)。例如:
创建文件test.sh:
1234567#! /bin/bashecho "文件名:"$0echo "第一个参数:"$1echo "第二个参数:"$2echo "第三个参数:"$3echo "第四个参数:"$4
然后执行该脚本:
1234567acs@9e0ebfcd82d7:~$ chmod +x test.sh acs@9e0ebfcd82d7:~$ ./test.sh 1 2 3 4文件名:./test.sh第一个参数:1第二个参数:2第三个参数:3第四个参数:4
其它参数相关变量
参数
说明
$#
代表文件传入的参数个数,如上例中值为4
$*
由所有参数构成的用空格隔开的字符串,如上例中值为"$1 $2 $3 $4"
$@
每个参数分别用双引号括起来的字符串, ...
linux_shell_函数
3. shell语法——函数bash中的函数类似于C/C++中的函数,但return的返回值与C/C++不同,返回的是exit code,取值为0-255,0表示正常结束。
如果想获取函数的输出结果,可以通过echo输出到stdout中,然后通过$(function_name)来获取stdout中的结果。
函数的return值可以通过$?来获取。
命令格式:
12345[function] func_name() { # function关键字可以省略 语句1 语句2 ...}
不获取 return值和stdout值示例
123456func() { name=yxc echo "Hello $name"}func
输出结果:
1Hello yxc
获取 return值和stdout值不写return时,默认return 0。
示例
12345678910111213func() { name=yxc echo "Hello $name" ...
linux_shell_概论
3. shell语法——概论概论shell是我们通过命令行与操作系统沟通的语言。
shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用。AC Terminal中的命令行可以看成是一个“shell脚本在逐行执行”。
Linux中常见的shell脚本有很多种,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
zsh
…
Linux系统中一般默认使用bash,所以接下来讲解bash中的语法。文件开头需要写#! /bin/bash,指明bash为脚本解释器。
学习技巧不要死记硬背,遇到含糊不清的地方,可以在AC Terminal里实际运行一遍。
脚本示例新建一个test.sh文件,内容如下:
123#! /bin/bashecho "Hello World!"
运行方式作为可执行文件
1234567acs@9e0ebfcd82d7:~$ chm ...
linux_shell_变量
3. shell语法——变量定义变量定义变量,不需要加$符号,例如:
123name1='yxc' # 单引号定义字符串name2="yxc" # 双引号定义字符串name3=yxc # 也可以不加引号,同样表示字符串
使用变量使用变量,需要加上$符号,或者${}符号。花括号是可选的,主要为了帮助解释器识别变量边界。
1234name=yxcecho $name # 输出yxcecho ${name} # 输出yxcecho ${name}acwing # 输出yxcacwing
只读变量使用readonly或者declare可以将变量变为只读。
12345name=yxcreadonly namedeclare -r name # 两种写法均可name=abc # 会报错,因为此时name只读
删除变量unset可以删除变量。
123name=yxcunset nameecho $name # 输出空行
变量类型
自定义变量(局部变量)子进程不能访问的变 ...
linux_shell_test命令与判断符号[]
3. shell语法——test命令与判断符号[]逻辑运算符&&和||
&& 表示与,|| 表示或
二者具有短路原则:expr1 && expr2:当expr1为假时,直接忽略expr2expr1 || expr2:当expr1为真时,直接忽略expr2
表达式的exit code为0,表示真;为非零,表示假。(与C/C++中的定义相反)
test命令在命令行中输入man test,可以查看test命令的用法。
test命令用于判断文件类型,以及对变量做比较。
test命令用exit code返回结果,而不是使用stdout。0表示真,非0表示假。
例如:
12345678test 2 -lt 3 # 为真,返回值为0echo $? # 输出上个命令的返回值,输出0acs@9e0ebfcd82d7:~$ ls # 列出当前目录下的所有文件homework output.txt test.sh tmpacs@9e0ebfcd82d7:~$ test -e test.sh && echo "exist ...