LINUX 入门
shell练习
day2 20240423
day3 20240424
耗时180min
一开始都要加#!/bin/bash
1变量
- 命名,定义(没空格)
- 使用 $xx ${xx}
- 只读 readonly xx
- 删除 unset xx; 删不了只读
- type: 局部;环境;shell
2字符串
可以无引号
- 单引号: 成对出现;引号内变量无效
- 双引号:单个可以出现用转义;引号内变量有效
- 拼接:直接连着打印就行
- 长度:${#xx}
- 子串:${xx: 起点:终点}
- 找子串:反引号 io哪个 字母先出现就计算), echo `expr index “$xx” 待选的多个字母io``
3数组
仅1维,无多维; 下标0开始;不能<0
- 定义 array_name=(value0 value1 value2 value3);array_name[0]=value0
- 读数组元素:echo ${array_name[@或者下标]} @代表所有
- 长度:
- 取得数组元素的个数length=${#array_name[@]}
- 取得数组单个元素的长度 lengthn=${#array_name[n]}
4注释
单行#
多行 :<<EOF … EOF eof可以是任何符号
报错:发现出鬼了:**EOF !都行,但是唯独单引号‘**就是不行
warning: here-document at line 5 delimited by end-of-file (wanted `EOF`
解答:
末尾的EOF后面带有空格,EOF前后都不应有空格或其他符号。去掉EOF两边的空格和符号后,执行通过。
5 shell传递参数
-
获取命令行的每个参数 $n n代表第几个参数, so 语句后面可以加或者不加;都行
$ ./test.sh 1 2 3 Shell 传递参数实例! 执行的文件名:./test.sh # 这是第0个参数 第一个参数为:1 第二个参数为:2 第三个参数为:3
-
特殊字符 自己查吧P17
- $# 取参数个数
- $* 作为一个“”string打印; $@作为n个""string分别打印看例子
6 运算符
-
算术运算符
表达式直接算不是‘’是反引号`, 要有空格,2+2错, 2 + 2
*必须转义符\ \*
条件[]要有空格 [ $a != b ] , [ b ], [ b],[a != $b]没空格就是错的
#!/bin/bash a=5 b=4 val=`expr $a \* $b` val2=`expr 2 \* 3` echo $val $val2
-
关系[]
-ge -gt -lt -le -eq -ne 只能比数字,比不了string
-
bool []
与-a(and) 或-o(or) 非!
-
逻辑[[]]]要双括号!!!!! : && ||
-
string运算:
=, !=
长度-z $a; 非零-n $a
空 $ 空返回false
-
检测文件属性,没看,用了查就行
7 echo
- 打印字符串: 可不加""
- 打印双引号加转义\
- 变量:$
- echo -e “OK! \n” # -e 开启转义
- echo -e “OK! \c” # -e 开启转义 \c 不换行
- 显示结果定向至文件,不打印在屏幕: echo “It is a test” > myfile
- 单引号:原样输出字符串,不进行转义或取变量
- 显示命令执行结果
echo date
8 printf
默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n
- printf “%-10s %-8s %-4.2f\n” 郭靖 男 66.1234
- %-10s 10s 指一个宽度为 指一个宽度为 10 个字符( -左对齐,没有默认右对齐)
- %-4.2f 宽度4的float, 保留2位小数
转义含义:自己查表吧
9 test
- 数值:test $[num1] -eq $[num2] 6个
- string:test $num1 = $num2 4个
- 文件测试
10 流程控制
-
if: 可以分行,或者
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
多个
if condition1 then command1 elif condition2 then command2 else commandN fi
-
for
for loop in 1 2 3 4 5 do echo "The value is: $loop" done
-
while
while(( $int<=5 )) do echo $int let "int++" done
let
它用于执行一个或多表达式变量计算中不需要加上$来表示变量
-
无限循环
2中while,一种for
-
until循环
一般为 条件表达式,如果返回值false 则继续执行循环体内的语句 和while反的
-
case: 模式和执行到;;结束
read aNum case $aNum in 1) echo '你选择了 1' ;; 2) echo '你选择了 2' ;; 3) echo '你选择了 3' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac
esac结束
;;代表break
-
跳出: continue, break
11 函数
-
def
funWithReturn(){ echo "这个函数会对输入的两个数字进行相加运算..." echo "输入第一个数字: " read aNum echo "输入第二个数字: " read anotherNum echo "两个数字分别为 $aNum 和 $anotherNum !" return $(($aNum+$anotherNum)) } funWithReturn echo "输入的两个数字之和为 $? !"
参数可以不写!
调用返回值 用**$?**
必须在使用前定义,不存在类似C++的声明
-
函数参数
$n n<10
${n} n>=10
$* 一个“”来获取所有参数
$# 其他查表
12 输入 /输出重定向
自己查表: 向右输出 向左输入
0标准输入 1标准输出 2标准错误
-
输出
直接在命令行或者在.sh里写都行,最前面的$不用加
#!/bin/bash who > users cat users
如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾
-
输入
command1 < infile > outfile
stdin重定向到infile,从infile读入输入,stdout重定向到Outfile输出写入到outfile
-
深入
运行命令时 同时打开stdin0 stdout1 stderr2
command 2 > file command 2 >> file 输出错误追加到file结尾
stdout和stderr合并重定向到file; 用>&合并重定向
command > file 2>&1
-
Here document
delimiter前后不要乱加空格 tab,delimiter可以叫EOF 或其它符号都行!! 别用单引号,因为document部分里可能有单引号,会混乱的
command << delimiter document delimiter 命令行里 wc -l <<EOF 欢迎来到 零声学院 www.0voice.com EOF 输出 3
脚本里 #!/bin/bash cat << EOF 欢迎来到 零声学院 www.0voice.com EOF
-
/dev/null
是一个特殊的文件,写入到它内容都会被丢弃;如果尝试从该读取那什也读不到 禁止输出的效果
command > /dev/null
13 文件包含
. 或者source 要有空格
就是直接用某个sh文件内的代码,同时,
注: 被包含的文件不需要手动添加可执行权限 不用chmod +x 名.sh
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
source ./test1.sh
echo "零声学院官网地址:$url"