实用 shell 知识
Posted 看,未来
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实用 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
另外,还有几个特殊字符用来传递参数:
运算符
关系运算符
逻辑运算符
字符串运算符
文件测试运算符
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 输入/输出重定向
实用脚本收集
判定指令是否执行成功
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.
用到再补。
以上是关于实用 shell 知识的主要内容,如果未能解决你的问题,请参考以下文章