参考链接:
- Shell编程 4小时快速上手_哔哩哔哩_bilibili
- linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]-CSDN博客
cat
命令的常用功能是将文件内容打印并输出到屏幕上。
cool@cool:~/Shell_Learning$ vim demo.txt cool@cool:~/Shell_Learning$ cat demo.txt hello world this is a test
除此之外,cat
命令也能创建和编辑新文件,由于该用法用的不多,所以作者就不在这里展开讨论了。
echo命令能将指定文本显示在Linux命令行上,或者通过重定向符写入到指定的文件中。
>
为重定向符号,可以将内容追加到文件中,如果有同名文件会先清除原文件所有内容>>
为追加重定向符号,不会清除文件的内容,而是将对应内容追加到文件的末尾行cool@cool:~/Shell_Learning$ echo "hello" hello cool@cool:~/Shell_Learning$ echo "hello">hello.txt cool@cool:~/Shell_Learning$ cat hello.txt hello cool@cool:~/Shell_Learning$ echo "world">>hello.txt cool@cool:~/Shell_Learning$ cat hello.txt hello world
grep命令是Linux系统中最重要的命令之一,其功能是从文本文件或管道数据流中筛选匹配的行及数据。
这两个文本编辑器学习起来难度比较大,且学了不常用容易忘,下面是几篇相关文章:
vim文本编辑器,是由 vi 发展演变过来的文本编辑器,使用简单、功能强大、是 Linux 众多发行版的默认文本编辑器。
vim编辑器主要有三种工作模式:
i
或 a
进入编辑模式,可对文件内容进行编辑。Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,用户每输入一条命令,Shell就解释执行一条。
Shell存在于操作系统的最外层,负责与用户直接对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,然后输出到屏幕返回给用户。输入系统用户名和密码并登录到Linux后的所有操作都是由Shell解释与执行的。
Shell脚本主要分为两大类:Bourne shell和C shell。Linux系统中的主流Shell是bash。
Bourne shell包含三个类型:Bourne shell(sh)、Korn shell(ksh)、Bourne Again Shell(bash)
C shell包含两个类型:csh和tsh。
可以通过以下命令查看当前Linux系统的Shell支持情况:
cat /etc/shells
在我的Ubuntu20.04执行该命令,结果如下:
cool@cool:~/Shell_Learning$ cat /etc/shells /bin/sh /bin/bash /usr/bin/bash /bin/rbash /usr/bin/rbash /bin/dash /usr/bin/dash
可以通过以下命令查看当前Linux系统默认的Shell
echo $SHELL
输出结果一般是:/bin/bash
shell脚本文件第一行一般第一行会指出由哪个程序(解释器)来执行脚本中的内容,一般为:
#!/bin/bash
其他内容就根据我们的需求编辑就行,可以是我们在shell终端输入的命令,也可以包含选择语句、循环语句、shell函数等,具体写法不在本章展开。
执行脚本文件一般有4种方法。
bash demo.sh
./demo.sh
source demo.sh
. demo.sh
demo.sh
脚本。这意味着脚本中的所有变量和环境改变都仅在这个子 shell 中有效,而不会影响当前的 shell。demo.sh
脚本。脚本中的所有变量和环境改变都会直接反映在当前的 shell 中。chmod +x demo.sh
Shell变量可分为:环境变量(全局变量)和普通变量(局部变量)。
常见的系统环境变量:
$0 当前脚本的名称; $n 当前脚本的第n个参数,n=1,2,…9; $* 当前脚本的所有参数(不包括程序本身); $# 当前脚本的参数个数(不包括程序本身); $? 前一个命令或程序执行完后的状态,返回0表示执行成功; $$ 程序本身的PID号。 PATH 命令所示路径,以冒号为分割; HOME 打印用户家目录; SHELL 显示当前Shell类型; USER 打印当前用户名; ID 打印当前用户id信息; PWD 显示当前所在路径; TERM 打印当前终端类型; HOSTNAME 显示当前主机名; HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间; RANDOM 随机生成一个 0 至 32767 的整数; HOSTNAME 主机名
环境变量可以在终端中设置和创建,但是终端关闭后变量值就会丢失,如果想永久保存环境变量,可以将变量配置在:
# 按照系统规范,所有环境变量的名字均采用大写形式。等号两边不能有空格 export NUM=1 # 或者 NUM=100 export NUM
查看环境变量:
env
查看当前Shell的所有变量,包括全局变量和局部变量:
set
取消定义的环境变量:
unset NUM
普通变量(本地变量/局部变量)在用户当前Shell生存期的脚本中使用,这个值只在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出,那么变量的值将会无效。
为普通变量赋值有三种方法:
变量=value 变量='value' 变量="value"
变量=`ls` 变量=$(ls) # 示例: a=`ls` echo $a
echo {a..z} # 输出为:a b c d e f g h i j k l m n o p q r s t u v w x y z echo {1..9} # 输出为:1 2 3 4 5 6 7 8 9
$?
:用于获取执行上一个指令的执行状态返回值,0表示成功,非0表示失败。仅列举几个常用的:
在[] 中使用的比较符号 | 在(()) 和[[]] 中使用的比较符号 | 说明 |
---|---|---|
-eq | ==或= | 相等 |
-ne | != | 不相等 |
-gt | > | 大于 |
-ge | >= | 大于等于 |
-lt | < | 小于 |
-le | <= | 小于等于 |
二元数字在[] 中使用-gt、-le类符号的比较: |
[ 2 -gt 1 ] && echo 1 || echo 0 # 输出为1 [ 2 -lt 1 ] && echo 1 || echo 0 # 输出为0
二元数字在(())
中的比较。
((3>2)) && echo 1 || echo 0 ((3<2)) && echo 1 || echo 0 ((3==2)) && echo 1 || echo 0
文件测试表达式:(这些操作符号对于[[]]
、[]
、test
的测试表达式是通用的)
操作符 | 说明 |
---|---|
-d | 文件存在且为目录则为真,则测试表达式成立 |
-f | 文件存在且为普通文件则为真,则测试表达式成立 |
-e | 文件存在则为真,-e不辨别是目录还是文件 |
字符串测试操作符:
常用字符串测试操作符 | 说明 |
---|---|
-n “字符串” | 若字符串的长度不为0,则为真 |
-z “字符串” | 若字符串的长度为0,则为真 |
“字符串1”=“字符串2” | 若字符串1等于字符串2,则为真;可使用"==“替代”=" |
“字符串1”!=“字符串2” | 若字符串1不等于字符串2,则为真 |
语法如下:
# 单分支结构 if <条件表达式>;then 指令 fi # 双分支结构 if <条件表达式>;then 指令 else 指令 fi # 例如: if [ -f "$file1" ];then echo 1 else echo 0 fi
read -t 10 -p "input a number:" num # 变量前需要有空格 -t 10 等待10s echo $num read -t 10 -p "input two number:" num1 num2 # 变量前需要有空格 echo $num1 $num2
case条件语句相当于多分支的if/elif/else条件语句,但是它比这些条件语句看起来更规范更工整。
语法格式如下:
case "变量" in 值1) 指令.. ;; 值2) 指令.. ;; *) 指令.. esac # 示例: #!/bin/bash read -p "input a number:" num case "$num" in 1) echo "the num is 1" ;; 2) echo "the num is 2" ;; [3-9]) echo "the num is $num" ;; *) echo "error!" ;; esac
while <条件表达式> do 指令 done # 示例: while true # 条件为真一直运行 do uptime sleep 2 # 让程序暂停2秒,控制循环的频率,否则会消耗大量的系统资源 done
for 变量名 in 变量取值列表 do 指令 done
标准写法:
# 函数声明: function 函数名() { 指令 return n } # 函数调用: # 执行不带参的函数时,直接输入函数名 function # 执行带参的函数时 function 参数1 参数2
shell中的break
、continue
、exit
、return
:
break n
:如果省略n,则表示跳出整个循环,n表示跳出循环的层数。continue n
:如果省略n,则表示跳过本次循环,进入下一次循环;n表示退到第n层继续循环。exit n
:退出当前shell程序,n为程序执行的状态返回值。在下一个shell中可以通过$?
接收exit的返回值n。return n
:作为函数的返回值。#!/bin/bash num=$[RANDOM%100+1] while true read -p "猜一个1到100之间的数:" guess do if [ $num -gt $guess ];then echo "猜小了" elif [ $num -lt $guess ];then echo "猜大了" elif [ $num -eq $guess ];then echo "恭喜你!猜对了!" break else echo "请按要求输入数字!" fi done
#!/bin/bash jindu(){ while true do echo -n "#" sleep 0.2 done } cur_path=$PWD echo "开始创建新文件夹..." mkdir $cur_path/jindu1 $cur_path/jindu2 if [ $? -eq 0 ];then file1_path=$cur_path/jindu1 file2_path=$cur_path/jindu2 echo "新文件夹创建成功!" fi touch $file1_path/test111.txt jindu & # 这里的&表示将jindu函数放在后台运行 JINDU_PID=$! cp -a $file1_path $file2_path sleep 2 kill $JINDU_PID echo -e "\n拷贝完成!" sleep 0.5 rm -rf $file1_path $file2_path if [ $? -eq 0 ];then echo "脚本运行完毕,已自动将文件删除" fi