1 变量
1.0 命名
- 变量名和等号之间不能有空格;
- 只能由英文,数字和下划线组成;
- 首字母不能以数字开始;
- 不能使用标点符号;
- 不能使用bash关键字;
- 定义变量时不需要美元$符号;
- 使用help直接获取bash内置关键字;
名称旁边的星号(*)表示该命令被禁用。
job_spec [&] history [-c] [-d 偏移量] [n] 或 hist>
(( 表达式 )) if 命令; then 命令; [ elif 命令; the>
. 文件名 [参数] jobs [-lnprs] [任务声明 ...] 或 jobs>
: kill [-s 信号声明 | -n 信号编号 | >
[ 参数... ] let 参数 [参数 ...]
[[ 表达式 ]] local [option] 名称[=值] ...
alias [-p] [名称[=值] ... ] logout [n]
bg [任务声明 ...] mapfile [-d 分隔符] [-n 计数] [-O >
bind [-lpvsPSVX] [-m 键映射] [-f 文> popd [-n] [+N | -N]
break [n] printf [-v var] 格式 [参数]
builtin [shell 内建 [参数 ...]] pushd [-n] [+N | -N | 目录]
caller [表达式] pwd [-LP]
case 词 in [模式 [| 模式]...) 命令 ;;> read [-ers] [-a 数组] [-d 分隔符] [->
cd [-L|[-P [-e]] [-@]] [目录] readarray [-n 计数] [-O 起始序号] [->
command [-pVv] 命令 [参数 ...] readonly [-aAf] [名称[=值] ...] 或 r>
compgen [-abcdefgjksuv] [-o 选项] [-> return [n]
complete [-abcdefgjksuv] [-pr] [-DE] > select NAME [in 词语 ... ;] do 命令;>
compopt [-o|+o 选项] [-DE] [名称 ...> set [--abefhkmnptuvxBCHP] [-o 选项名>
continue [n] shift [n]
coproc [名称] 命令 [重定向] shopt [-pqsu] [-o] [选项名 ...]
declare [-aAfFgilnrtux] [-p] [名称[=> source 文件名 [参数]
dirs [-clpv] [+N] [-N] suspend [-f]
disown [-h] [-ar] [jobspec ... | pid > test [表达式]
echo [-neE] [参数 ...] time [-p] 管道
enable [-a] [-dnps] [-f 文件名] [名称> times
eval [参数 ...] trap [-lp] [[参数] 信号声明 ...]
exec [-cl] [-a 名称] [命令 [参数 ...]> true
exit [n] type [-afptP] 名称 [名称 ...]
export [-fn] [名称[=值] ...] 或 expor> typeset [-aAfFgilnrtux] [-p] 名称[=>
false ulimit [-SHabcdefiklmnpqrstuvxPT] >
fc [-e 编辑器名] [-lnr] [起始] [终结]> umask [-p] [-S] [模式]
fg [任务声明] unalias [-a] 名称 [名称 ...]
for 名称 [in 词语 ... ] ; do 命令; do> unset [-f] [-v] [-n] [名称 ...]
for (( 表达式1; 表达式2; 表达式3 )); > until 命令; do 命令; done
function 名称 { 命令 ; } 或 name () {> variables - 一些 shell 变量的名称>
getopts 选项字符串 名称 [参数] wait [-n] [编号 ...]
hash [-lr] [-p 路径名] [-dt] [名称 ..> while 命令; do 命令; done
help [-dms] [模式 ...] { 命令 ; }
1.2 变量赋值
1.2.1 直接赋值
name="tianlanlan"
1.2.2 语句赋值
将/et目录下的文件名遍历出来
for file_name in `ls /etc`
for file in $(ls /etc)
1.2.3 获取变量值
美元符号:$
#! /bin/bash
echo "hello world!"
name="tianlanlan"
echo $name
- Result
hello world!
tianlanlan
1.2.4 输出变量值
echo
#! /bin/bash
echo "hello world!"
其中,#!
选择脚本解释器,/bin/bash
解释器.
for file_name in `ls ~/xinPrj`; do
echo $file_name
done
- Result
docker
dpkg
drirc
1.2.5 只读变量
#! /bin/bash
name="tianlanlan"
readonly name
name="shuiqingqing"
1.2.6 删除变量
#! /bin/bash
name="shuiqingqing"
unset name
1.3 字符串
1.3.1 单引号
- 单引号的任何字符都会原样输出,单引号字符串中的变量是无效的
- 单引号字符串中不能出现单独一个的单引号,但是可成对出现,作为字符串pinj使用
1.3.2 双引号
- 双引号里可以有变量
- 双引号里可以有转义符
1.3.3 字符串拼接
#! /bin/bash
name="shui"
name_a="$name qingqing"
echo $name_a
1.3.4 字符串长度
#! /bin/bash
name="shui"
name_b="$name qingqing"
echo ${#name_b}
- Result
14
1.3.5 提取字符
#! /bin/bash
name="shuiqingqing"
echo ${name: 1:5}
- Result
huiqi
1.3.6 查找字符
输出i的位置(不是索引)
#! /bin/bash
name_a = "shuiqingqing"
echo `expr index "$name_a" i`
- Result
4
1.4 数组
1.4.1 定义数组
array_name=(value_1 value_2 ... value_n)
数组元素用空格隔开.
1.4.2 数组值索引
- 索引单个元素
value=${array_name[i]}
- 获取所有元素
value=${array_name[@]}
value=${array_name[*]}
- Demo
#! /bin/bash
info=('tianlanlan' 25)
echo info[0]:${info[0]}
echo info value: ${info[@]}
echo info value: ${info[*]}
- Result
info[0]:tianlanlan
info value: tianlanlan 25
info value: tianlanlan 25
1.4.3 数组长度
- Demo
#! /bin/bash
info=('tianlanlan' 25)
echo info[0]:${info[0]}
echo info value: ${#info[@]}
echo info value: ${#info[*]}
- Result
2
2
2 注释
2.1 单行注释
# 我是单行注释
2.2 多行注释
- 第一种方式
:<<EOF
我
是
多
行
注释
EOF
- 第二种方式
:<<'
我
是
多
行
注释
'
- 第三种方式
:<<!
我
是
多
行
注释
!
3 参数传递
分别表示传递的第i个参数,其中$0为当前文件名,$1,…,n表示第1至n个传递的参数.
$0 $1 ... $n
序号 | 指令 | 功能 |
---|---|---|
1 | $# | 传递到脚本的参数个数 |
2 | $* | 以一个单字字符串显示所有向脚本传递的参数 |
3 | $$ | 脚本运行的当前进程ID |
4 | $! | 后台运行的最后一个进程ID |
5 | $@ | 返回传递到脚本的全部参数 |
6 | $- | 显示shell使用的当前选项 |
7 | $? | 显示最后命令的退出状态 |
$*
和$@
都是显示传递的所有参数,但是:"*"
表示"250 250"
,"@"
表示"250"
,"250"
4 运算符
4.1 算术运算符
原生bash不支持简单的数学计算,但是可以通过其他命令实现,如awk
,expr
,其中expr
最常用.
表达式和运算符之间要有空格,如125 + 125
序号 | 运算符 | 说明 |
---|---|---|
1 | + | 加法 |
2 | - | 减法 |
3 | \* | 乘法 |
4 | / | 除法 |
5 | % | 取余 |
6 | = | 赋值 |
7 | == | 相等,若数字相等,则返回true |
8 | != | 不相等,若数字不相等,返回true |
- Demo
#! /bin/bash
# add
add=`expr 125 + 125`
echo "add: $add"
# subtraction
sub=`expr 12 - 4`
echo subtraction: $sub
# multiplication
mul=`expr 50 \* 5`
echo multiplication: $mul
# division
div=`expr 4 / 3`
echo division: $div
if [ 1 == 1 ]
then
echo equal
else
echo not equal
fi
if [ 1 != 3 ]
then
echo not equal
else
echo equal
fi
- Result
add: 250
subtraction: 8
multiplication: 250
division: 1
equal
not equal
4.2 关系运算符
序号 | 运算符 | 描述 |
---|---|---|
1 | -eq | 两个数是否相等,相等返回true |
2 | -ne | 两个数是否不等,不等返回true |
3 | -gt | 左边数大于右边,返回true |
4 | -lt | 左边小于右边,返回true |
5 | -ge | 左边大于等于右边,true |
6 | -le | 左边小于等于右边,true |
4.3 布尔运算符
序号 | 运算符 | 描述 |
---|---|---|
1 | ! | 不等于,返回true |
2 | -o | 或运算 |
3 | -a | 与运算 |
- Demo
#! /bin/bash
a=25
b=250
c=0
if [ $a -o $b ]
then
echo 至少一个为真
fi
if [ $a -a $c ]
then
echo 至少一个为假
fi
- Result
至少一个为真
至少一个为假
4.4 逻辑运算符
序号 | 运算符 | 描述 |
---|---|---|
1 | && | 逻辑与 |
2 | || | 逻辑或 |
- Demo
a=2500
b=250
c=0
if [[ $a -gt $b && $a -gt $c ]]
then
echo a is largest
else
echo a is not largest
fi
- Result
a is largest
4.5 字符串运算符
序号 | 运算符 | 描述 |
---|---|---|
1 | = | 字符串相等,true |
2 | != | 字符串不相等,true |
3 | -z | 字符串长度为0,true |
4 | -n | 字符串长度不为0,true |
5 | $ | 字符串不为空,true |
- Demo
#! /bin/bash
s1="tianlanlan"
s2="shuiqingqing"
s3=""
if [ $s1 != $s2 ]
then
echo s1 and s2 was differ
fi
if [ -z $s1 ]
then
echo s1 was empty
else
echo s1: $s1
fi
if [ $s3 ]
then
echo s3: $s3
else
echo s3 was empty
fi
- Result
s1 and s2 was differ
s1: tianlanlan
s3 was empty
4.6 文件测试运算符
序号 | 运算符 | 描述 |
---|---|---|
1 | -b file | 文件为块设备文件,true |
2 | -c file | 文件为字符设备文件,true |
3 | -d file | 文件为目录,true |
4 | -f file | 文件为普通文件(非目录或设备文件),true |
5 | -g file | 文件设置SGID位,true |
6 | -k file | 文件设置粘着位(sticky bit),true |
7 | -p file | 文件有名管道,true |
8 | -u file | 文件设置了SUID位,true |
9 | -r file | 文件可读,true |
10 | -w file | 文件可写,true |
11 | -x file | 文件可执行,true |
12 | -s file | 文件不为空,true |
13 | -e file | 文件存在,true |
- Demo
file=`pwd`/test.sh
dir=`pwd`
echo current director: $dir
echo current file: $file
if [-d $dir ]
then
echo dir is a directory
else
echo dir is not a directory
fi
if [ -f $file ]
then
echo file is a normal file
else
echo file is not a file
fi
- Result
current director: /home/xdq/xinPrj/Shell
current file: /home/xdq/xinPrj/Shell/test.sh
dir is a directory
file is a normal file
5 echo
功能:输出字符串
格式:
echo string
5.1 显示普通字符串
echo hello
echo "Hello"
5.2 显示变量
name="tianlanlan"
echo $name
echo "$name"
5.3 显示换行/不换行
- 换行
echo -e "hello \n"
echo "world"
- 不换行
echo -e "hello \c"
echo "world"
5.4 显示结果定向至文件
- 将数据写入对应文件,替换之前的文件.
file_another="/home/xdq/xinPrj/Shell/test_another.sh"
txt_file="/home/xdq/xinPrj/Shell/test.txt"
echo "hello" > $txt_file
echo "hello world!" > $file_another
- Result
test.txt
hello
test_another.sh
hello
- 文件追加数据
echo "tianlanlan" >> $file_another
- Result
test_another.sh
hello
tianlanlan
5.5 显示命令执行结果
echo `pwd`
6 小结
序号 | 指令 | 功能 |
---|---|---|
1 | $ | 取变量值 |
2 | # | 取变量长度 |
3 | @ | 全部元素 |
4 | * | 全部元素 |
5 | `` | 上符号中加入指令即可执行Linux系统命令,如pwd,ls |
参考文献
[1]https://www.runoob.com/linux/linux-shell.html
[2]https://www.cnblogs.com/singeryoung/p/9554551.html