命令使用:echo、eval、exec、export、read、shift、exit(要求退出码为222)这些命令的功能,以及用例
Echo
用例:
[kiosk@foundation0 1]$ echo -n "ni hao aa"
ni hao aa[kiosk@foundation0 1]$
[kiosk@foundation0 1]$ echo -e "data=1;$data"
data=1;1
转义字符:
[kiosk@foundation0 1]$ echo {1..20}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
[kiosk@foundation0 1]$ echo i\tlove\tyou
itlovetyou
[kiosk@foundation0 1]$ echo -e i\tlove\tyou
Itlovetyou
[kiosk@foundation0 1]$ echo "i\tlove\tyou"
i\tlove\tyou
[kiosk@foundation0 1]$ echo -e "i\tlove\tyou"
i love you
[kiosk@foundation0 1]$ echo -e "i\blove\tyou"
love you
[kiosk@foundation0 1]$ echo -e "i\vlove\vyou"
i
love
you
eval
eval 命令格式:eval args 功能:当shell程序执行到eval语句时,shell读入参数args,并将它们组合成一个新的命令,然后执行。
[kiosk@foundation0 1]$ a='data;tail -1 /etc/passwd'
[kiosk@foundation0 1]$ echo $a
data;tail -1 /etc/passwd
[kiosk@foundation0 1]$ eval echo $a
data
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
#等价于组合
[kiosk@foundation0 1]$ echo "data";tail -1 /etc/passwd
data
dhcpd:x:177:177:DHCP server:/:/sbin/nologin
[kiosk@foundation0 1]$ echo $a | grep eval #标准输入
Exec
exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程就终止了
[kiosk@foundation0 ~]$ cd /etc
[kiosk@foundation0 etc]$ ssh kiosk@172.25.254.250
Warning: Permanently added '172.25.254.250' (ECDSA) to the list of known hosts.
This system is not registered to Red Hat Insights. See https://cloud.redhat.com/
To register this system, run: insights-client –register
Last login: Tue Aug 16 02:12:57 2022 from 172.25.254.1
[kiosk@foundation0 ~]$ exec cd /home/
Connection to 172.25.254.250 closed.
export
设置或者显示环境变量
[kiosk@foundation0 ~]$ read -p "Please input a string: " -t 5 name
Please input a string: tt
[kiosk@foundation0 ~]$ echo $name
Tt
Shift
在程序中每使用一次shift语句,都会使所有的位置参数依次向左移动一个位置,并使位置参 数$#减1,直到减到0为止。
echo $#
echo $*
echo $0
echo $1
echo $2
shift
echo “***************”
echo $#
echo $@
输出 shift 向左移动一位
“” ‘’ 的区别:
[kiosk@foundation0 1]$ data=1
[kiosk@foundation0 1]$ echo "$data"
1
[kiosk@foundation0 1]$ echo '$data'
$data
#""双引号调用data=1 ''单引号直接输出 ``执行命令
[kiosk@foundation0 1]$ data=`pwd`
[kiosk@foundation0 1]$ echo $data
/home/kiosk/wuw/1
exit(要求退出码为222)
echo “123”
exit 222
echo “456”
[kiosk@foundation0 1]$ vim hh.sh
[kiosk@foundation0 1]$ bash ./hh.sh
123
[kiosk@foundation0 1]$ echo $?
222
read
使用read从标准输入读取两个变量: name1和name2, 要求name1包含空格
read命令可从标准输入读取字符串等信息,传给shell程序内部定义的变量。
-p prompt:设置提示信息
-t timeout:设置输入等待时间,单位默认为秒
[kiosk@foundation0 ~]$ echo -n "Please input your name: ";read name1 name2
Please input your name: one two
[kiosk@foundation0 ~]$ echo $name1
one
[kiosk@foundation0 ~]$ echo $name2
two
[kiosk@foundation0 ~]$ echo -n "please input your name:";read name1
please input your name:hh gg
[kiosk@foundation0 ~]$ echo $name1
hh gg
通过些.sh实现
for i in "name1 name2"
do
echo $i
done
echo "@@@@@@@@@@@"
for i in "name1" "name2"
do
echo $i
done
echo "@@@@@@@@@@@"
输出:
name1 name2
@@@@@@@@@@@
name1
name2
@@@@@@@@@@@
**exort和declare
定义自定义环境变量:(使用export和declare)**
针对root用户的所有连接:root_data=root
针对所有用户的变量: all_data=all
查看所有的环境变量, 查看所有变量
[kiosk@foundation0 1]$ declare -x all_data=all
[kiosk@foundation0 1]$ root_data=root;export root_data
[kiosk@foundation0 1]$ echo $root_data
root
[kiosk@foundation0 1]$ vim j.sh
[kiosk@foundation0 1]$ sh j.sh
all
root
J.sh
echo $all_data
echo $root_data
脚本执行
脚本执行的方式及特点:用样例验证
交互式执行
(2)作为程序文件执行(常用) 对于一组需要经常重复执行的Shell语句来说,将它们保存在一个文件中来执行。我们通常称这种包 含多个Shell语句的文件为Shell脚本,或者Shell脚本文件。脚本文件是普通的文本文件,可使用任何的 文本编辑器查看或修改Shell脚本
方法:
(1)bash ./filename.sh(产生子进程,再运行,使用当前指定的bash shell去运行) (2)./filename.sh(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x 权限)
(3)source ./filename.sh(source命令是一个shell内部命令,其功能是读取指定的shell程序文件,并 且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创建的变量都会保存到 当前的shell里面)
(4). filename.sh(和source一样,也是使用当前进程执行)
[root@localhost test]# echo 'userdir=`pwd`' > test3.sh
[root@localhost test]# cat test3.sh userdir=`pwd`
(1)[root@localhost test]# bash test3.sh
[root@localhost test]# echo $userdir
[root@localhost test]#
(2)[root@localhost test]# chmod a+rx test3.sh
[root@localhost test]# ./test3.sh
[root@localhost test]# echo $userdir
[root@localhost test]#
(3)[root@localhost test]# source test3.sh
[root@localhost test]# echo $userdir /test
(4)[root@localhost test]# . test3.sh
[root@localhost test]# echo $userdir /test
执行shell脚本时,如果使用1和2这种方式执行会在当前的进程下产生一个新的bash子进程,所以子进程 切换到了/tmp目录,当脚本结束,子进程也就结束了,所以当前进程的目录不会发生变化;3和4方式执 行时,不会产生新的进程,所以脚本执行结束后当前的目录会变成/tmp。
vim改缩进四格
设置vim编辑sh文件的缩进为4个空格
vim ~/.vimrc
autocmd FileType sh setlocal ai ts=4 sw=4 et
$#,$*,$@,$n,$? $#,$*,$@,$n,$?的使用
$# 命令行参数的个数
$n 表示传递给脚本的第n个参数,例如$1表示第一个参数,$2表示第二个参数,$3表示第三 个参数 $0 当前脚本的名称
$* 以"参数1 参数2 参数3…"的形式返回所有参数的值 $@ 以“参数1”“参数2”“参数3”…的形式返回所有的值 $? 前一个命令或者函数的返回状态码。
?
的返回值用法:(
1
)判断命令、脚本或函数等程序是否执行成功(
2
)若在脚本中调用执行“
e
x
i
t
数字”,则会返回这个数字给“
?的返回值用法:(1)判断命令、脚本或函数等程序 是否执行成功(2)若在脚本中调用执行“exit 数字”,则会返回这个数字给“
?的返回值用法:(1)判断命令、脚本或函数等程序是否执行成功(2)若在脚本中调用执行“exit数字”,则会返回这个数字给“?”变量(3)如 果是在函数里,则通过“return 数字”把这个数字以函数值的形式传给“$?”
echo $#
echo “The is $0”
echo “The is $1”
echo “The is $2”
echo "All is $*"
echo "All is $@"
输出:
2
“The is ./one.sh”
“The is 123”
“The is 456”
All is 123 456
All is 123 456