把书读薄-Shell入门基础

举报
彭世瑜 发表于 2021/08/13 23:46:25 2021/08/13
【摘要】 运行 1、作为可执行程序 #!/bin/bash # 指定解释此脚本文件的程序 $ chmod a+x test.sh # 使脚本具有执行权限 $ ./text.sh # 执行脚本 ./test.sh # 在当前目录找 test.sh # 去 PATH 里寻找 1234567 2、作为解释器参数 $ bash test.sh 1 变量 key="va...

运行

1、作为可执行程序

#!/bin/bash # 指定解释此脚本文件的程序

$ chmod a+x test.sh   # 使脚本具有执行权限
$ ./text.sh # 执行脚本

./test.sh # 在当前目录找
test.sh # 去 PATH 里寻找

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2、作为解释器参数

$ bash test.sh

  
 
  • 1

变量

key="value" # 定义变量, 变量名和等号之间不能有空格
readonly key # 只读变量, 再次赋值会报错

echo $key # 使用变量, 使用变量要在变量名前面加美元符号
echo ${key}   # 识别变量的边界

unset key # 删除变量

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

变量类型

  1. 局部变量
  2. 环境变量
  3. shell变量

字符串

字符串可以用单引号,也可以用双引号,也可以不用引号

单引号:原样字符串,不可以有变量和转义字符
双引号:可以有变量和转义字符

字符串拼接

name="Tom"

echo "hi "$name"!"  # hi Tom!
echo "hi ${name}!"  # hi Tom!
echo 'hi ${name}!'  # hi ${name}!

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
echo ${#name} # 字符长度 3
echo ${name:1:4}   # 字符串截取 om 

  
 
  • 1
  • 2

数组

Bash Shell只支持一维数组, 下标由0开始

# 定义数组, "空格"分割
names=("Tom" "Jack")

ages=(
23
24
)

# 数组元素赋值
names[2]="Jimi"

# 获取数组元素
echo ${names[2]}  # Jimi

# 获取数组所有元素
echo ${ages[@]}   # 23 24
echo ${ages[*]}   # 23 24

# 获取数组的长度
echo ${#names[@]}  # 3

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

注释

# 单行注释

:<<EOF
多行注释
再写一行
EOF

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

传递参数

# $ ./1.sh 1 2 3 4

echo $#  # 参数个数 4
echo $*  # 显示所有参数 1 2 3 4
echo $@  # 显示所有参数 1 2 3 4

echo $0  # 文件名 ./1.sh
echo $1  # 第一个参数 1
echo $2  # 第二个参数 2

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

基本运算符

1、算术运算符
原生bash不支持数学运算,使用expr

+   加法 `expr $a + $b`  
-   减法 `expr $a - $b`
*   乘法 `expr $a \* $b`
/   除法 `expr $b / $a`
%   取余 `expr $b % $a`
=   赋值 a=$b
==  相等 [ $a == $b ]  注意空格
!=  不相等 [ $a != $b ] 

# 注意是反引号`, 需要空格
# MAC表达式  $(expr 1 + 1)  

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2、关系运算符
关系运算符只支持数字

-eq 相等equal [ $a -eq $b ]
-ne 不相等not equal [ $a -ne $b ]
-gt 大于greater than [ $a -gt $b ] 
-lt 小于lower than [ $a -lt $b ]
-ge 大于等于greater&equal  [ $a -ge $b ] 
-le 小于等于lower&equal [ $a -le $b ]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3、布尔运算符

![ ! false ]
-o  或   [ $a -lt 20 -o $b -gt 100 ]
-a  与   [ $a -lt 20 -a $b -gt 100 ]

  
 
  • 1
  • 2
  • 3

4、逻辑运算符

&&  AND [[ $a -lt 100 && $b -gt 100 ]]
||  OR  [[ $a -lt 100 || $b -gt 100 ]]

# [[ 防止脚本中的逻辑错误

  
 
  • 1
  • 2
  • 3
  • 4

5、字符串运算符

=   相等  [ $a = $b ]
!=  不相等 [ $a != $b ]
-z  长度为0 [ -z $a ]
-n  长度为0 [ -n "$a" ]
$   不为空   [ $a ] 

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

6、文件测试运算符

-b file 设备文件 [ -b $file ]
-c file 字符设备文件 [ -c $file ]
-d file 目录 [ -d $file ]
-f file 普通文件 [ -f $file ]
-r file 可读 [ -r $file ]
-w file 可写 [ -w $file ]
-x file 可执行 [ -x $file ]
-s file 文件不为空(文件大小大于0) [ -s $file ]
-e file 存在 [ -e $file ]

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

综合示例

#!/bin/bash

# 算术计算
echo `expr 1 + 1`  # 注意空格 2

# 数字比较
a=1; b=2

if [ $a == $b ]
then echo "a==b"
else echo "a!=b"
fi

# 关系比较
if [ $a -eq $b ]
then echo "a==b"
else echo "a!=b"
fi

# 布尔运算
if [ $a -eq $b -o $a -gt $b ]
then echo "a==b or a>b"
else echo "a!=b and a<b"
fi

# 逻辑运算
if [[ $a -eq $b || $a -gt $b ]]
then echo "a==b or a>b"
else echo "a!=b and a<b"
fi

# 字符串运算符
if [ $a ]
then echo "a不为空"
else echo "a为空"
fi

# 文件
if [ -f "1.sh" ]
then echo "是文件"
else echo "不是文件"
fi

  
 
  • 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
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

echo

echo "hello world" # 普通字符串, 自动添加换行符
echo hello world # 双引号可以省略
echo "\"hello world\"" # 显示转义字符  "hello world"
echo -e "hello\n world" # -e开启转义 \n换行
echo -e "hello world \c" # -e开启转义 \c不换行
echo `date` # 显示命令结果 Thu Jul 4 12:44:11 CST 2019

name="Tom"
echo ${name} # 输出变量

echo "hi" > file.txt # 结果重定向

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

示例:读取输入并输出

#!/bin/bash

read -p "请输出用户名:" content   # -p提示文字
read -p "请输出密码:" -s password  # -s 隐藏输入内容
echo -e "\n用户名: ${content}\n密码: ${password}"

:<<EOF
$ ./1.sh
请输出用户名:Tom
请输出密码:
用户名: Tom
密码: 123
EOF

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

printf 命令

示例

printf "%-10s |%10.4f\n" "小明" 2.3 # 不会自动添加换行符
# -表示左对齐,没有则表示右对齐
# 10个字符宽的字符内
# 保留4位小数

  
 
  • 1
  • 2
  • 3
  • 4

格式化

d: Decimal 十进制整数
s: String 字符串
c: Char 字符
f: Float 浮点

  
 
  • 1
  • 2
  • 3
  • 4

转义字符

\c  不显示换行字符
\n  换行
\r  回车(Carriage return)
\t  水平制表符
\v  垂直制表符
\\  一个字面上的反斜杠字符

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

test测试

# 算数运算
echo $[1+1]  # 2

# 比较
a=1
b=1

if test $a -eq $b
then echo "a==b"
else echo "a!=b"
fi
# a==b

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

流程控制

if

if condition1
then command1
elif condition2 
then command2
else commandN
fi


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

for

for var in item1 item2 ... itemN
do command1 command2 ... commandN
done

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

while

while condition
do command
done

  
 
  • 1
  • 2
  • 3
  • 4

until

until condition
do command
done

  
 
  • 1
  • 2
  • 3
  • 4

case

casein
模式1) # 右圆括号分支 command1 ;;   # 两个分号表示break
模式2) command2 ;;
*) command3 ;;
esac

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

跳出循环
break和continue

综合示例

read -p "输入start 或者 stop: " user_command 

case $user_command in
"start") echo "start..." ;;
"stop") echo "stop..." ;;
*) echo "输入不对啊" ;;
esac

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

函数

# 定义函数,function可以加也可以省略, 不带任何参数
function func(){ echo "第一个参数 $1"  # $1获取第一个参数 echo "参数个数 $#" # $#获取参数个数 echo "所有参数 $@" # $@获取所有参数 return 0  # 函数返回值(0-255)
}

# 调用函数,不加括号
func hi 你好
# 第一个参数 hi
# 参数个数 2
# 所有参数 hi 你好

echo $?   # 显示最后命令的退出状态
# 0

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

输入/输出重定向

文件描述符
0 通常是标准输入(STDIN)
1 是标准输出(STDOUT)
2 是标准错误输出(STDERR)

command1 > file1 # 输出重定向
command1 >> file1 # 追加输出重定向
command 2 > file # stderr重定向
command > file 2>&1 # 合并stdout和stderr
command1 < file1 # 输入重定向
command > /dev/null 2>&1  # 屏蔽输出

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

示例

$ echo -e 'hello world\nhi china' > text.txt

$ cat text.txt
hello world
hi china

$ wc -l < text.txt 2

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

文件包含

1.sh

#!/bin/bash

function func(){ echo "hi" return 0
}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.sh

#!/bin/bash

# . ./1.sh  # 使用.引入文件, 注意空格

source ./1.sh  # 使用source引入文件

func

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

参考

Shell 教程-菜鸟教程

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/94623427

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。