记录:427
场景:Shell脚本基础应用。脚本格式、执行方式、定义和使用变量、双引号和单引号、反引号和$()、读取用户输入和文件、输出与输入重定向、export命令、alias命令、exit命令、查看内建命令。
版本:CentOS Linux release 7.9.2009。
Shell是一个应用程序,它连接了用户和 Linux 内核,让用户能够更加高效、安全、低成本地使用Linux内核。
Shell本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序。
1.CentOS的命令行控制台
使用Xmanager Enterprise的Xshell登录CentOS的命令行控制台。
1.1root用户命令行提示
[root@hadoop211 ~]#
解析:[],是标准格式。root表示当前是超级用户root。@hadoop211表示用户在hadoop211主机。~,表示当前用户root的根目录。#,表示超级用户命令提示符,操作命令在此后输入。
执行pwd命令:
[root@hadoop211 ~]# pwd
/root
1.2普通用户命令行提示
[learn@hadoop211 ~]$
解析:[],是标准格式。learn表示当前是普通用户learn。@hadoop211表示用户在hadoop211主机。~,表示当前用户learn的根目录。$,表示普通用户命令提示符,操作命令在此后输入。
执行pwd命令:
[learn@hadoop211 ~]$ pwd
/home/learn
2.Shell脚本格式
一般情况下,Shell脚本都是一个可执行文件。
2.1编辑脚本
脚本名称:b2023051601.sh
编辑命令:vi b2023051601.sh
脚本内容:
#!/bin/bash
echo "Hello Shell."
echo "Shell is a scripting language."
解析:#!表示指定脚本解释器,指定/bin/bash来执行b2023051601.sh脚本。
2.2脚本赋可执行权限
命令:chmod +x b2023051601.sh
2.3执行脚本
命令:./b2023051601.sh
输出:
Hello Shell.
Shell is a scripting language.
3.Shell脚本执行方式
3.1脚本作为独立程序运行
3.1.1使用./方式执行
(1)脚本
脚本名称:b2023051601.sh
脚本内容:
#!/bin/bash
echo "Hello Shell."
echo "Shell is a scripting language."
(2)执行
命令:./b2023051601.sh
(3)解析
在脚本中必须指定#!/bin/bash。脚本需赋可执行权限:chmod +x b2023051601.sh。
3.1.2使用bash执行
(1)脚本
脚本名称:b2023051602.sh
脚本内容:
echo "Hello Shell."
echo "Shell is a scripting language."
(2)执行
命令1:bash b2023051602.sh
命令2:/bin/bash b2023051602.sh
(3)解析
在脚本中不需要指定#!/bin/bash。脚本不需要赋可执行权限。
3.2当前进程中运行脚本
(1)脚本
脚本名称:b2023051603.sh
脚本内容:
echo "Hello Shell."
echo "Shell is a scripting language."
(2)执行
命令1:source b2023051603.sh
命令2:. b2023051603.sh
(3)解析
在脚本中不需要指定#!/bin/bash。脚本不需要赋可执行权限。
4.定义变量和使用变量
4.1脚本
脚本名称:b2023051604.sh
脚本内容:
#!/bin/bash
echo "定义变量,city01,city02,city03"
city01=Hangzhou
city02='Suzhou'
city03="Shanghai"
echo "使用变量"
echo $city01
echo ${city02}
echo "长三角城市包括: ${city01},${city02},${city03}"
4.2执行与输出
执行:bash b2023051604.sh
输出:
定义变量,city01,city02,city03
使用变量
Hangzhou
Suzhou
长三角城市包括: Hangzhou,Suzhou,Shanghai
4.3注意
在赋值时,在等于号=的左右两边不能有空格。
4.4设置只读变量和删除变量
脚本:
#!/bin/bash
echo "定义变量,city01,city02,city03"
city01=Hangzhou
city02='Suzhou'
city03="Shanghai"
echo "设置为只读变量"
readonly city03
city03="Ningbo"
echo "city03=${city03}"
echo "删除变量"
unset city02
echo "city02=${city02}"
执行:
定义变量,city01,city02,city03
设置为只读变量
b20230516041.sh: line 8: city03: readonly variable
city03=Shanghai
删除变量
city02=
解析:city03设置为readonly只读变量后已经无法修改。city02删除后输出已经没值。
5.双引号和单引号
使用单引号' '包围变量的值时,单引号里面内容原样输出。内容中有变量和命令也会把它原样输出。也就是使用单引号不会解析变量和命令。
使用双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。
单引号使用场景:显示纯字符串的情况,不希望解析变量、命令等的场景。
双引号使用场景:适合字符串中附带有变量和命令并且需要将其解析后再输出的场景。
5.1脚本
脚本名称:b2023051605.sh
脚本内容:
#!/bin/bash
echo "定义变量,city01,city02,city03"
city01=Hangzhou
city02='Suzhou'
city03="Shanghai"
echo "单引号输出"
echo '长三角城市包括: ${city01},${city02},${city03}'
echo "双引号输出"
echo "长三角城市包括: ${city01},${city02},${city03}"
5.2执行与输出
执行:bash b2023051605.sh
输出:
定义变量,city01,city02,city03
单引号输出
长三角城市包括: ${city01},${city02},${city03}
双引号输出
长三角城市包括: Hangzhou,Suzhou,Shanghai
6.反引号和$()
反引号``和$()可以把命令结果赋值给变量。
6.1脚本
脚本名称:b2023051606.sh
脚本内容:
#!/bin/bash
echo '使用反引号``把命令结果赋值给变量'
cityInfo01=`cat cityInfo.txt`
echo ${cityInfo01}
echo '使用$()把命令结果赋值给变量'
cityInfo02=$(cat cityInfo.txt)
echo ${cityInfo02}
6.2执行与输出
执行:bash b2023051606.sh
输出:
使用反引号``把命令结果赋值给变量
长三角城市包括上海、杭州、苏州等。
使用$()把命令结果赋值给变量
长三角城市包括上海、杭州、苏州等。
6.3文件内容
文件名称:cityInfo.txt
文件内容:
长三角城市包括上海、杭州、苏州等。
7.读取用户输入
7.1脚本
脚本名称:b2023051607.sh
脚本内容:
#!/bin/bash
echo "请输入城市名称:"
read cityname
echo "城市名称: ${cityname}"
7.2执行与输出
执行:bash b2023051607.sh
输出:
请输入城市名称:
Hangzhou
城市名称: Hangzhou
8.读取文件
8.1脚本
脚本名称:b2023051608.sh
脚本内容:
#!/bin/bash
echo '1.使用cat读取文件并逐行打印'
filePath=`pwd`
for line in `cat ${filePath}/province.txt`
do
echo "${line}"
done
echo " "
echo '2.使用read读取文件并逐行打印'
cat ${filePath}/province.txt | while read line
do
echo "${line}"
done
8.2执行与输出
执行:bash b2023051608.sh
输出:
1.使用cat读取文件并逐行打印
长三角省份有浙江、江苏等。
长三角最大都市是上海。
长三角经济发达。
2.使用read读取文件并逐行打印
长三角省份有浙江、江苏等。
长三角最大都市是上海。
长三角经济发达。
9.输出重定向
9.1脚本
脚本名称:b2023051609.sh
脚本内容:
#!/bin/bash
rm -rf city01.txt city02.txt
echo '>表示以覆盖的方式输出到文件'
for city in "杭州" "苏州" "上海"
do
echo ${city}>city01.txt
done
echo " "
echo '>>表示以追加的方式输出到文件'
for city in "杭州" "苏州" "上海"
do
echo ${city}>>city02.txt
done
9.2执行与输出
执行:bash b2023051609.sh
city01.txt和city02.txt内容:
[root@hadoop211 tutorial]# cat city01.txt
上海
[root@hadoop211 tutorial]# cat city02.txt
杭州
苏州
上海
10.输入重定向
command <file:使用<将文件内容重定向到命令输入端。
command <<EOF:从标准输入(键盘)中读取数据,直到遇见停止符EOF才停止输入。停止符EOF是任意的字符串,用户自己定义的符号。
command <file1 >file2:文件file1作为command的输入源,把command的处理结果输出到文件file2。
10.1脚本
脚本名称:b20230516010.sh
脚本内容:
#!/bin/bash
filePath=`pwd`
echo '1.使用<输入重定向到wc命令'
wc -l <${filePath}/province.txt
echo " "
echo '2.使用<输入重定向到read命令'
while read line
do
echo ${line}
done <${filePath}/province.txt
10.2执行与输出
执行:bash b20230516010.sh
输出:
1.使用<输入重定向到wc命令
3
2.使用<输入重定向到read命令
长三角省份有浙江、江苏等。
长三角最大都市是上海。
长三角经济发达。
11.export命令
export命令用于设置或显示环境变量。
Shell执行程序时,Shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅限于该次登陆操作。
11.1脚本
脚本名称:b2023051611.sh
脚本内容:
#!/bin/bash
echo "1.默认系统的Path变量"
echo $PATH
export WORK_HOME=/home/tutorial
echo "2.新增系统的Path变量后"
export PATH=$PATH:$WORK_HOME/bin
echo $PATH
11.2执行与输出
执行:bash b2023051611.sh
输出:
1.默认系统的Path变量
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/apps/module/jdk1.8.0_281/bin:/root/bin
2.新增系统的Path变量后
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/apps/module/jdk1.8.0_281/bin:/root/bin:/home/tutorial/bin
12.alias命令
alias不能写到自定义脚本中,如需重启生效可以写在/root/.bashrc文件中。
12.1使用alias
自定义命令别名:alias llh='ll -h'
12.2执行与输出
执行:llh
输出:
[root@hadoop211 ~]# alias llh='ll -h'
[root@hadoop211 ~]# llh
total 4.0K
-rw-------. 1 root root 1.4K Oct 21 2022 anaconda-ks.cfg
13.exit命令
使用exit退出程序,使用$?查看程序状态。
13.1脚本
脚本名称:b2023051613.sh
脚本内容:
#!/bin/bash
echo '设置exit命令状态码'
exit 16
13.2执行与输出
执行:bash b2023051613.sh
输出:
[root@hadoop211 tutorial]# bash b2023051613.sh
设置exit命令状态码
[root@hadoop211 tutorial]# echo $?
16
14.查看内建命令
14.1执行与输出
使用type查看一个命令使内建命令还是非内建命令。
[root@hadoop211 ~]# type cd
cd is a shell builtin
[root@hadoop211 ~]# type ll
ll is aliased to `ls -l --color=auto'
[root@hadoop211 ~]# type yum
yum is /usr/bin/yum
以上,感谢。
2023年5月16日