Shell基础:
查看操作系统支持的shell:
[root@rhel9 ansible]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
Shell的基本元素:
-
声明:声明用哪个命令解释器来解释并执行当前脚本文件中的语句,一般写的解释器为**#!/bin/bash**
-
命令:可执行语言,实现程序的功能
-
注释:说明某些代码的功能,通过添加注释提高代码的可读性
-
单行注释:
#echo "hello world"
-
多行注释:
:<<BLOCK .... BLOCK
-
-
赋予rx权限
Shell编程的规范:
-
脚本的文件名应见名知意
-
文件开头指定脚本解释器(#!/bin/bash)
-
开头加版本特权等信息
#Date :创建日期 #Author :作者 #Mail:联系方式 #Function :功能 #version :版本
-
尽量不使用中文注释
-
多使用内部命令,常用命令如下:
- echo
- eval
- exec
- export
- read
- shift
- exit
-
代码缩进(使代码结构更加清晰)
内部命令:
echo:
echo是用于终端打印的基本命令,默认情况下,echo 在每次调用后会添加一个换行符
[root@kittod ~]# echo hehe
hehe
[root@kittod ~]# echo haha
haha
[root@kittod ~]# echo "Welcome to bash"
Welcome to bash
[root@kittod ~]# echo 'Welcome to bash'
Welcome to bash
上面的方法看起来效果一样,但是在某些场合会得到不一样的结果
[root@kittod ~]# echo "the current directory is `pwd`"
the current directory is /root
[root@kittod ~]# echo 'the current directory is `pwd`'
the current directory is `pwd`
[root@kittod ~]# echo "hehe;hehe"
hehe;hehe
[root@kittod ~]# echo hehe;hehe
hehe
-bash: hehe: command not found
设置字体颜色:
echo -e "\e[1;31m this is test \e[0m"
设置为红色 把颜色还原
重置0,黑色30,红色31,绿色32,黄色33,蓝色34,洋红35,青色36,白色37
eval:
**功能:**当shell程序执行到eval语句时,shell读入参数args,组合为一个新的命令。
exec:
exec命令能够在不创建新的子进程的前提下,转去执行指定的命令,当指定的命令执行完毕后,该进程就终止了。
export:
设置或导出环境变量
[root@kittod ~]# mingzi=hehe
[root@kittod ~]# echo $mingzi
hehe
[root@kittod ~]# bash
[root@kittod ~]# echo $mingzi
[root@kittod ~]# exit
exit
[root@kittod ~]# export mingzi
[root@kittod ~]# bash
[root@kittod ~]# echo $mingzi
hehe
read:
类似于C语言Scanf
read 命令可从标准输入读取字符串等信息,传给shell程序内部定义的变量。
read 是一个重要的 bash 命令,用于从键盘或标准输入读取文本,我们可以使用 read 命
令以交互形式读取来自用户的输入,不过 read 能做的远不止这些。
通常我们按下回车键表示命令输入完成,但是很特殊情况下,我们需要基于字符数或者
特定字符来表示命令输入完成。
-p prompt:设置提示信息
-t timeout:设置输入等待时间,单位默认为秒
#未等待
read -t 5 -p "Please enter your name:" name
Please enter your name:wgq
[root@rhel9 01]# echo $name
wgq
#等待
Please enter your name:[root@rhel9 01]# echo $name
[root@rhel9 01]#
-n 表示限定输入的字符数。
-s 输入不回显
[root@rhel9 01]# read -s var
[root@rhel9 01]# echo $var
wgq
-d 定界符输入,以什么符号结束输入
[root@rhel9 01]# read -d "." var
wgqzqj.[root@rhel9 01]#
[root@rhel9 01]# echo $var
wgqzqj
[root@rhel9 01]#
shift:
shift,在程序中每使用一次shift语句,都会使所有的位置参数依次向左移动一个位置,并使位置参数$#减1,直到减到0为止。
exit:
exit,退出shell程序。在exit之后可以有选择地指定一个数作为返回状态
执行shell脚本的方式:
交互式执行:
[root@localhost ~]# for filename in `ls /etc`
do
if echo "$filename" | grep "passwd"
then
echo "$filename"
fi
done
作为程序文件执行:
对于一组需要经常重复执行的Shell语句来说,将它们保存在一个文件中来执行。我们通常称这种包含多个Shell语句的文件为Shell脚本,或者Shell脚本文件。脚本文件是普通的文本文件,可使用任何的文本编辑器查看或修改Shell脚本。
[root@localhost ~]# mkdir /test
[root@localhost ~]# cd /test
[root@localhost test]# vim test1.sh
#!/bin/bash
for filename in `ls /etc`
do
if echo "$filename" | grep "passwd"
then
echo "$filename"
fi
done
执行脚本的方法:
bash ./filename.sh
(产生子进程,再运行,使用当前指定的bash shell去运行)
./filename.sh
(产生子进程,再运行,使用脚本里面指定的shell去运行。使用该种方式执行需要x权限)
source ./filename.sh
(source命令是一个shell内部命令,其功能是读取指定的shell程
序文件,并且依次执行其中的所有的语句,并没有创建新的子shell进程,所以脚本里面所有创
建的变量都会保存到当前的shell里面)
.filename.sh
(和source一样,也是使用当前进程执行)
注意:
执行shell脚本时,如果使用1和2这种方式执行会在当前的进程下产生一个新的bash子进程,
所以子进程切换到了/tmp目录,当脚本结束,子进程也就结束了,所以当前进程的目录不会发生变化;3和4方式执行时,不会产生新的进程,所以脚本执行结束后当前的目录会变成 /tmp。