[shell]shell快速入门

脚本执行一般需要chmod进行加权限

1..#! /bin.bash

约定使用哪一种shell

2.echo 输出

3.shell变量

3.1注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。

3.2使用一个定义过的变量,只要在变量名前面加美元符号即可,eg
your_name=”qinjx”
echo y o u r n a m e e c h o {your_name}
推荐加上{} 便于区分边界

3.3只读变量 readonly

3.4unset删除变量

3.5变量类型
运行shell时,会同时存在三种变量:
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
3.5.1String类型 可以使用 “” 或者”
3.5.1.1单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
双引号的优点:
双引号里可以有变量
双引号里可以出现转义字符

3.5.1.2获取字符串长度
str=’abcd’
echo {#str}  3.5.1.3获取指定字符串  str=”abcd”  echo {str:1:2}

3.5.1.4查找
str=”abcd”
echo ${str:1:2}
string=”runoob is a great company”
echo expr index "$string" is # 输出 8

echo expr index "$str" b
注意最外层不是引号 是 tab上的“

3.5.2数组
只支持以为数组,不支持多维数组,并且不限制数组大小,下角标从0开始 用空格进行隔开
array={
1
2
3
4
}或者 array[0]=value[0]
eg:
array1=(1111 2 3 4 5 6)
array2[0]=1
array2[1]=2
array2[2]=3

echo ${array1[@]} array1的所有元素

echo ${array2[@]}

echo ${#array1[@]} array1的长度

echo ${#array1[0]} array1 角标为0的长度

4.注释
只支持#的单行注释

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

eg
echo “Shell 传递参数实例!”;
echo “第一个参数为:$1”;

echo “参数个数为: #”;  echo “传递的参数作为一个字符串显示: *”;

c h m o d + x t e s t . s h ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3

# 传递到脚本的参数个数 * 以一个单字符串显示所有向脚本传递的参数。如" 1 2 n”的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

6.shell基本运算符

算数运算符
关系运算符
布尔运算符
字符串运算符
文件测试运算符
6.1算术运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
val=expr 3 + 5
echo “输出 v a l e x p r 使 + ( ) ( ) i f t h e n f i M A C s h e l l e x p r ((表达式)),此处表达式中的 “*” 不需要转义符号 “\” 。

6.2关系运算符
运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ a e q b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ a n e b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ a g t b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ a l t b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ a g e b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ a l e b ] 返回 true。

6.3布尔运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o 或运算,有一个表达式为 true 则返回 true。 [ a l t 20 o b -gt 100 ] 返回 true。
-a 与运算,两个表达式都为 true 才返回 true。 [ a l t 20 a b -gt 100 ] 返回 false。
6.4逻辑运算符
运算符 说明 举例
&& 逻辑的 AND [[ a -lt 100 && b -gt 100 ]] 返回 false
|| 逻辑的 OR [[ a l t 100 | | b -gt 100 ]] 返回 true
6.5字符串运算符
= 检测两个字符串是否相等,相等返回 true。 [ a = b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ a ! = b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z a ] f a l s e n 0 0 t r u e [ n a” ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ a ] t r u e 6.6 b f i l e t r u e [ b file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c f i l e ] f a l s e d f i l e t r u e [ d file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f f i l e ] t r u e g f i l e S G I D t r u e [ g file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k f i l e ] f a l s e p f i l e t r u e [ p file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u f i l e ] f a l s e r f i l e t r u e [ r file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w f i l e ] t r u e x f i l e t r u e [ x file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s f i l e ] t r u e e f i l e t r u e [ e file ] 返回 true。

7 echo -e开启转义

8.printf命令

printf 命令模仿 C 程序库(library)里的 printf() 程序。
printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。
\a 警告字符,通常为ASCII的BEL字符
\b 后退
\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效),而且,任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符,都被忽略
\f 换页(formfeed)
\n 换行
\r 回车(Carriage return)
\t 水平制表符
\v 垂直制表符
\ 一个字面上的反斜杠字符
\ddd 表示1到3位数八进制值的字符。仅在格式字符串中有效
\0ddd 表示1到3位的八进制值字符

9.shell 的test命令

9.1数值测试
参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
num1=100
num2=150
if test n u m 1 e q num2
then
echo “num1 与num2 相等”
else
echo “num1 与num2 不相等”
fi
9.2字符串测试
参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
9.3文件测试
参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真

10.流程控制

每个流程中不可出现为空的情况,当为空时可以省略else
10.1for循环
与其他编程语言类似,Shell支持for循环。
for循环一般格式为:
for var in item1 item2 … itemN
do
command1
command2

commandN
done

var是每个循环的当前的对象
10.2while
while condition
do
command
done
eg
num=1
while (( n u m <= 5 ) ) d o e c h o num
let “num++”
done

10.3util
until condition
do
command
done
10.4case
case 值 in
模式1)
command1
command2

commandN
;;
模式2)
command1
command2

commandN
;;
esac
eg
echo “输入1-3”
read num
case $num in
1)
echo “1”
;;
2)
echo “2”
;;
3)
echo “3”
;;
esac

跳出循环的方式 break continue

11.shell函数

funWithReturn(){
echo “这个函数会对输入的两个数字进行相加运算…”
echo “输入第一个数字: ”
read aNum
echo “输入第二个数字: ”
read anotherNum
echo “两个数字分别为 a N u m anotherNum !”
return ( ( aNum+ anotherNum))  }  funWithReturn  echo “输入的两个数字之和为 ? !”

函数返回值在调用该函数后通过 ? 使 s h e l l 使 使 # 传递到脚本的参数个数
I D ! 后台运行的最后一个进程的ID号
@ *相同,但是使用时加引号,并在引号中返回每个参数。
S h e l l 使 s e t ? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
function fun(){
echo 1 e c h o 2
echo $3
}
fun a b c

12.输入输出的重定向

大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
重定向命令列表如下
命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

12.引入shell脚本

. 或者 source

猜你喜欢

转载自blog.csdn.net/drdongshiye/article/details/80792569