shell基本学习

1、shell自定义变量的定义与引用

自定义变量的定义就是直接通过 变量名=变量值 的方式进行定义,比如 pa1=192.168.100.100,注意等号前后是没有任何空格的;
变量名的命名规则为:只能由数字、字母、下划线组成,且首字母不能是数字;
自定义变量的引用有两种方式,一种是前面直接加$符号,比如$pa1,另一种是${}方式,比如${pa1}。引用变量时建议统一使用第二种,第一种容易造成歧义(比如$10这种引用方式不确定是要用$1还是$10)


2、shell常用的预定义变量及其作用

$0   脚本本身文件名字
$N   执行脚本时传递的参数,N替换为具体的数字,比如$1指传入的第一个参数,$7指传入的第7个参数
$*   执行脚本时传入的所有参数,比如sh test.sh a1 a2 a3 a4 ,则$*指 a1 a2 a3 a4
$@   执行脚本时传入的所有参数,比如sh test.sh a1 a2 a3 a4 ,则$@指 a1 a2 a3 a4
$#   执行脚本时传入的参数数量,比如sh test.sh a1 a2 a3 a4 ,则$#为 4
$?   上一个命令执行的返回值,为0表示成功,常用于判断前面命令是否执行成功,根据前面命令执行结果来采取不同动作


3、shell中预置变量 $@ 与 @* 的区别

当 $* 和 $@ 不被双引号" "包围时,它们之间没有任何区别,都是将接收到的每个参数看做一份数据,彼此之间以空格来分隔;
但是当它们被双引号" "包含时,就会有区别了:
    "$*"会将所有的参数从整体上看做一份数据,而不是把每个参数都看做一份数据。
    "$@"仍然将每个参数都看作一份数据,彼此之间是独立的。
比如 执行sh test.sh a1 b1 c1时,"$*" 的值是作为一个整体,其实是一个字符串"a1 b1 c1",而 "$@" 的值不是作为一个整体,其实是多个字符串"a1" "a2" "a3"。


4、shell中为变量赋值的几种方式以及每种方式的具体实现

一是直接赋值,即直接通过 变量名=变量值 的方式进行赋值,比如 pa1=192.168.100.100
二是从键盘读入赋值,即通过read命令来进行赋值,具体形式:
    read -p [提示信息] [变量名]   比如 read -p "请输入IP地址:" ip  
    这条命令就是让用户输入IP地址,然后赋值给ip变量,在用户输入前会给用户打印一个提示信息 "请输入IP地址:"
三是使用命令行参数赋值,也就是在执行脚本时通过传递参数的方式赋值,脚本里可以通过位置变量$1、$2等来获取传入的参数值
四是通过命令的执行结果赋值,即可以将一条命令的执行结果全部赋值给一个变量,具体形式:
    cmd=`data +%F`
    这条命令是将data +%F命令的执行结果赋值给cmd变量
五是通过文件读取数据赋值。


5、shell中双引号("")、单引号('')、反引号(``)的区别

双引号与单引号都是包起来一系列字符串,不过双引号中的字符串如果有变量引用,则会将变量的实际值替换进去,而单引号则会原样输出而不会替换。
反引号是命令调用,反引号中包着命令,并将命令执行结果作为一个整体使用,等价于$()。


6、shell常用文件测试

-d  测试是否为目录
-e  测试文件或目录是否存在
-f  测试是否为文件
-r  测试当前用户对文件是否可读
-w  测试当前用户对文件是否可写
-x  测试当前用户对文件是否可执行
写法:[ -d filename ]


7、shell常用数值测试

-eq  等于
-ne  不等于
-gt  大于
-lt  小于
-ge  大于等于
-le  小于等于
写法:[ 2 -eq 3 ]


8、shell常用字符串测试

-z  测试字符串长度是否为0
-n  测试字符串长度是否不为0
!=  测试字符串是否不相等
=   测试字符串是否相等
写法:[ -z $str ]    [ $str1 = $str2 ]


9、shell常用逻辑运算符

-a 或 &&   与
-o 或 ||   或
!          非
写法:[ -f file1 -a -d dir2 ]  [ -f file1 ] && [ -d dir2 ]


10、shell if语句写法

单分支:
if [ 条件测试 ]; then
    xxx
    xxx
fi

双分支:
if [ 条件测试 ]; then
    xxx
    xxx
else
    xxx
    xxx
fi

多分支:
if [ 条件测试 ]; then
    xxx
    xxx
elif [ 条件测试 ]; then
    xxx
    xxx
elif [ 条件测试 ]; then
    xxx
    xxx
...
else
    xxx
    xxx
fi


11、shell case语句写法

case 变量值 in
表达式1)
    语句1
    ...
    ;;
表达式2)
    语句2
    ...
    ;; 
...
*)
    语句n
esac

其中表达式中,*匹配任意字符,?匹配任意单个字符,[abc]指a、b、c其中之一,[a-n]指从a到n中任一字符,|可以连接多个字符,多重选择


12、shell for循环语句写法

for 变量名 in 值列表
do
    语句体
    ...
done

其中,值列表可以是多个值直接列出,比如: 1 3 5 6 8 这种,如果是连续值也可以简写,比如 {2..55}表示2 3 4 ...55,从2到55。 

13、 shell while循环语句写法

while 条件测试
do
    语句体
    ...
done

其中条件测试为真则进入循环体执行,为假则退出循环体


14、 shell until语句写法

until 条件测试
do
    语句体
    ...
done

其中条件测试为假才进入循环体执行,为真则退出循环体


15、 shell 逐行读取文件的几种惯常用法

for循环方式:
for line in `cat user.txt`
do
    echo $line
done

while循环方式:
while read line
do
    echo $line
done < user.txt


16、 shell中for循环体后台并发语法

for 变量名 in 值列表
do
    {
    语句体
    ...
    }&
done


17、 shell中普通数组的定义

直接定义:
数组名=(值1 值2 值3)

下标定义:
数组名[0]=值1;数组名[1]=值2;数组名[2]=值3


18、 shell中数组的引用

${!leno[*]}    #引用数组所有索引
${!leno[@]}    #引用数组所有索引
${leno[*]}     #引用数组所有值
${leno[@]}     #引用数组所有值
${#leno[@]}    #统计数组元素个数
${leno[n]}     #引用数组下标为n的元素
${leno[@]:n}   #引用数组下标n开始的全部元素
${leno[@]:m:n} #引用数组下标m开始的n个元素
${#leno[n]}    #统计数组下标为n的元素的字符数
${#leno}       #统计数组下标为0的元素的字符数
${leno}        #引用数组下标为0的元素


19、数组删除元素

unset array     #删除整个数组
unset array[n]  #删除数组下标为n的元素


20、函数的定义

函数名(){
    语句
    ...
}


21、函数的调用

无参调用:
函数名

有参调用:
函数名 参数1 参数2 ...参数n


22、重定向

文件描述符   文件名   类型              硬件
0          stdin   标准输入文件        键盘
1          stdout  标准输出文件        显示器
2          stderr  标准错误输出文件     显示器

输出重定向:
command >file              以覆盖的方式,把 command 的正确输出结果输出到 file 文件中。
command >>file             以追加的方式,把 command 的正确输出结果输出到 file 文件中。
command 2>file             以覆盖的方式,把 command 的错误信息输出到 file 文件中。
command 2>>file            以追加的方式,把 command 的错误信息输出到 file 文件中。
command >file 2>&1         以覆盖的方式,把正确输出和错误信息同时保存到同一个文件(file)中。
command >>file 2>&1        以追加的方式,把正确输出和错误信息同时保存到同一个文件(file)中。
command >file1 2>file2     以覆盖的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。
command >>file1  2>>file2  以追加的方式,把正确的输出结果输出到 file1 文件中,把错误信息输出到 file2 文件中。

输入重定向:
command <file              将 file 文件中的内容作为 command 的输入。
command <<END              从标准输入(键盘)中读取数据,直到遇见分界符 END 才停止(分界符可以是任意的字符串,用户自己定义)。


23、正则表达式

元字符:

\    
将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。

^    
匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。

$    
匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。

*    
匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

+    
匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

?    
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。

{n}    
n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

{n,}    
n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

{n,m}    
m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

?    
当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

.    
匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。

x|y    
匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

[xyz]    
字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

[^xyz]    
负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。

[a-z]    
字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

[^a-z]    
负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。

\d    
匹配一个数字字符。等价于 [0-9]。

\D    
匹配一个非数字字符。等价于 [^0-9]。

\n    
匹配一个换行符。等价于 \x0a 和 \cJ。

\r    
匹配一个回车符。等价于 \x0d 和 \cM。

\s    
匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

\S    
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t    
匹配一个制表符。等价于 \x09 和 \cI。

\w    
匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。

\W    
匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。


24、 grep用法:

grep [参数] “匹配串” 文件名
或者结合管道符来用:
命令xxx |grep [参数] “匹配串”

常用参数:
-A<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容,eg:-A5。
-B<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容,eg:-B5。
-c : 计算符合样式的列数。
-C<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容,eg:-C5。
-E : 将样式为延伸的正则表达式来使用。
-i : 忽略字符大小写的差别。
-l : 列出文件内容符合指定的样式的文件名称。
-L : 列出文件内容不符合指定的样式的文件名称。
-n : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o : 只显示匹配PATTERN 部分。
-q : 不显示任何信息。
-r : 递归的查找。
-v 或 --invert-match : 显示不包含匹配文本的所有行。


25、 cut用法:

cut 参数 文件名    或者    命令 |cut 参数

常用参数:
-f : 通过指定哪一个字段进行提取。cut命令使用“TAB”作为默认的字段分隔符。
-d : “TAB”是默认的分隔符,使用此选项可以更改为其他的分隔符。
--complement : 此选项用于排除所指定的字段(相当于反选)。


26、 sort用法:

sort 参数 文件名    或者    命令 |sort 参数

常用参数:
-n                 依照数值的大小排序。
-u                 意味着是唯一的(unique),输出的结果是去完重了的。
-o <输出文件>       将排序后的结果存入指定的文件。
-r                 以相反的顺序来排序。
-t <分隔字符>       指定排序时所用的栏位分隔字符。
-k n               指定以第n列作为排序


27、 wc用法:

wc 参数 文件名    或者    命令 |wc 参数

常用参数:
-c 显示字节数。
-l 显示行数。
-w 显示字数。
-L 显示最长行的字节数。


28、 printf用法:

printf  格式化字符串  参数列表

常用格式化占位符:
%s 字符串
%d 十进制整数
%f 浮点数
%.2f  保留两位小数的浮点数
%-10d 左对齐且宽度为10


29、 sed命令常用参数:

-n 静默输出,不打印前面的标准输出,常与p结合使用
-i 直接修改原始文件
-r 支持扩展正则表达式


30、 sed常用编辑命令:

a\ 添加行,在指定行的下一行添加行
i\ 添加行,在指定行添加行
d  删除行
p  打印
s  查找替换   (可以通过g参数指明是本行仅第一个匹配项替换还是本行所有匹配项全部替换)


31、 sed常用命令举例:

打印:
sed -n 'p' test                #打印文件全部内容
sed -n '1p' test               #打印文件第一行
sed -n '1,4p' test             #打印文件第1-4行
sed -n '/pattern/p' test       #打印能够匹配到pattern的行
sed -n '/pattern/!p' test      #打印除了能够匹配到pattern的行之外的其余行
sed -n '/pattern/,+2p'         #打印能够匹配到pattern的行及其后面2行

删除:
sed '1d' test                  #删除文件第一行
sed '1,4d' test                #删除文件第1-4行
sed '/pattern/d' test          #删除能够匹配到pattern的行
sed '/pattern/!d' test         #删除除了能够匹配到pattern的行之外的其余行(只保留匹配行)
sed '/pattern/,+2d'            #删除能够匹配到pattern的行及其后面2行

添加:
sed '2astring' test            #在第2行的下一行添加string
sed '/pattern/astring' test    #在匹配到pattern的下一行添加string
sed '2istring' test            #在第2行添加string(原第2行内容移至下一行)
sed '/pattern/istring' test    #在匹配到pattern的当前行添加string(原行内容移至下一行)

查找替换:
sed 's/oldstr/newstr/'         #将oldstr替换为newstr,每行中仅替换第一个匹配值
sed 's/oldstr/newstr/g'        #将oldstr替换为newstr,每行中所有匹配值都将进行替换


32、 awk简要用法:

awk '/daemon/' test                                  #将含有daemon的行打印出来
awk -F":" '{print $2,$4}' test                       #将文件以:分隔,并输出第2和第4列
awk -F":" '{print "username: "$1"\tuid: "$3}' test   #将文件以:分隔,并输出附带额外内容的指定列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sky wide

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值