实用 shell 知识

实用 shell 知识_第1张图片

放这个图呢,没别的意思。

文章目录

    • 基础知识
    • Shell 变量
      • 使用变量
    • Shell 字符串
      • 单引号
      • 双引号
      • 拼接字符串
      • 获取字符串长度
      • 提取子字符串
    • Shell 数组
      • 读取数组
      • 获取数组的长度
    • Shell 注释
    • Shell 传递参数
    • 运算符
      • 关系运算符
      • 逻辑运算符
      • 字符串运算符
      • 文件测试运算符
    • echo
    • 流程控制
      • 分支
      • for 循环
      • while 语句
      • 跳出循环
    • Shell 输入/输出重定向
    • 实用脚本收集
      • 判定指令是否执行成功
      • 批量测试文件是否存在

基础知识

./XXX.sh

这样运行


Shell 变量

your_name="XXX"

1、变量名和等号之间不能有空格。
2、命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
3、中间不能有空格,可以使用下划线 _。
4、不能使用标点符号。
5、不能使用bash里的关键字(可用help命令查看保留关键字)。

使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}

可能某一天你们会看到有人没有加 ${},不要吃惊。


Shell 字符串

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。

单引号

str='this is a string'

单引号字符串的限制:

单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号

your_name="runoob"
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

输出结果为:

Hello, I know you are "runoob"! 

双引号的优点:

双引号里可以有变量
双引号里可以出现转义字符

拼接字符串

your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting  $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2  $greeting_3

输出结果为:

hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !

获取字符串长度

string="abcd"
echo ${#string} #输出 4

提取子字符串

以下实例从字符串第 2 个字符开始截取 4 个字符:

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

Shell 数组

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:

数组名=(值1 值2 ... 值n)

例如:

array_name=(value0 value1 value2 value3)

或者

array_name=(
value0
value1
value2
value3
)

还可以单独定义数组的各个分量:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

可以不使用连续的下标,而且下标的范围没有限制。

读取数组

读取数组元素值的一般格式是:

${数组名[下标]}

使用 @ 符号可以获取数组中的所有元素

echo ${array_name[@]}

获取数组的长度

获取数组长度的方法与获取字符串长度的方法相同,例如:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

Shell 注释

以 # 开头的行就是注释,会被解释器忽略。

多行注释还可以使用以下格式:

:<<EOF
注释内容...
注释内容...
注释内容...
EOF

EOF 也可以使用其他符号:

:<<'
注释内容...
注释内容...
注释内容...
'

Shell 传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
$ ./test.sh 1 2 3

另外,还有几个特殊字符用来传递参数:
实用 shell 知识_第2张图片


运算符

关系运算符

实用 shell 知识_第3张图片

逻辑运算符

在这里插入图片描述

字符串运算符

实用 shell 知识_第4张图片

文件测试运算符

实用 shell 知识_第5张图片


echo

用于字符串的输出。

echo string
echo "It is a test"
echo -e "OK! \n" # -e 开启转义
echo "It is a test"

流程控制

分支

判断上条语句执行是否成功:

shell中使用符号“$?”来显示上一条命令执行的返回值,如果为0则代表执行成功,其他表示失败。

if [ $? -ne 0 ]; then
    echo "failed"
else
    echo "succeed"
fi
if condition
then
    command1 
    command2
    ...
    commandN 
fi
if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi
if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

for 循环

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

写成一行:

for var in item1 item2 ... itemN; do command1; command2… done;

当变量值在列表里,for 循环即执行一次所有命令,使用变量名获取列表中的当前取值。命令可为任何有效的 shell 命令和语句。in 列表可以包含替换、字符串和文件名。

in列表是可选的,如果不用它,for循环使用命令行的位置参数。

while 语句

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据。其语法格式为:

while condition
do
    command
done

跳出循环

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,Shell使用两个命令来实现该功能:break和continue。
break命令


Shell 输入/输出重定向

实用 shell 知识_第6张图片


实用脚本收集

判定指令是否执行成功

if [ $? -ne 0 ]; then
    echo "failed"
else
    echo "succeed"
fi

这个今天我就一直在用,因为执行成功失败都是要写日志的,而且是分开写日志。


批量测试文件是否存在

[root@host ~]# cat testfile.sh       
#!/bin/bash 
 
 
for file in test*.sh 
do 
  if [ -f $file ];then 
     echo "$file existed." 
  fi 
done 
 
[root@host ~]# ./testfile.sh 
test.sh existed. 
test1.sh existed. 
test2.sh existed. 
test3.sh existed. 
test4.sh existed. 
test5.sh existed. 
test78.sh existed. 
test_dev_null.sh existed. 
testfile.sh existed.  

用到再补。

你可能感兴趣的:(百家之言,bash,linux,开发语言)