shell脚本是什么
一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们
经常需要使用多个命令来完成一项任务,我们可以添加这些命令在一个文本文
件(Shell脚本)来完成这些日常工作任务。
什么是默认登录shell,如何改变指定用户的登录shell
在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。
使用chsh命令或usermod命令可以改变默认的shell。
usermod -s shell 用户
chsh -s shell 用户
可以在shell脚本中使用哪些类型的变量
在shell脚本,我们可以使用两种类型的变量:
是由系统自己创建的,这些变量通常由大写字母组成,可以通过“set”命令查看
是由系统用户来生成和定义,变量的值可以通过命令“echo $<变量名>”查看
如何将标准输出和错误输出同时重定向到同一位置
方法一:2>&1
ls /usr/share/doc > out.txt 2>&1
方法二:&>
ls /usr/share/doc &> out.txt
在脚本中常用 &>/dev/null 把命令的输出结果干掉
shell脚本中“if”语法如何嵌套
if [ condition1 ];then
command1
if [ condition2 ];then
command2
fi
else
if [ condition3 ];then
command3
elif [ condition4 ];then
command4
else
command5
fi
fi
shell脚本中“$?”标记的用途是什么
在写一个shell脚本时,如果想要检查前一命令是否执行成功,在 if 条件判断
中可以使用“$?”来检查前一命令的结束状态。
如果结束状态是0,说明前一个命令执行成功;
如果结束状态不是0,说明命令执行失败。
如 在判断vsftpd软件包是否安装的脚本中:
#!/bin/bash
rpm -q vsftpd &> /dev/null
if [ $? -eq 0 ];then
echo "vsftpd已经安装"
else
echo "该软件包没有安装,正在安装...."
yum install -y vsftpd &> /dev/null
if [ $? -eq 0 ];then
echo "vsftpd安装成功"
else
echo "vsftpd安装失败"
fi
fi
在shell脚本中如何比较两个数字
在 if 条件判断中使用下面的符号进行判断
-eq 相等
-ne 不等
-gt 大于
-lt 小于
-ge 大于等于
-le 小于等于
如:
#!/bin/bash
x=10
y=20
if [ $x -gt $y ];then
echo “x is greater than y”
else
echo “y is greater than x”
fi
shell脚本中break命令的作用
终止循环
shell脚本中continue命令的作用
跳出本次循环,进行下一轮循环
shell脚本中case语句的语法
case $var in 匹配变量值;var代表是变量名
pattern 1) 模式1;可以匹配多个模式,多个模式之间用 | 分隔
command1 需要执行的语句
;; 两个分号代表命令结束
pattern 2)
command2
;;
pattern 3)
command3
;;
*) default,不满足以上模式,默认执行*)下面的语句
command4
;;
esac esac表示case语句结束
shell脚本中while循环语法
while 表达式(条件判断)
do
command
...
done
如何使脚本可执行
//为脚本添加可执行权限
[root@MissHou shell01]# chmod +x 1.sh
//全路径执行脚本
[root@MissHou shell01]# /shell/shell01/1.sh
或
//相对路径执行脚本(确保和脚本在同一目录下)
[root@MissHou shell01]# ./1.sh
“#!/bin/bash”的作用
#!魔法字符,告诉系统这个脚本需要使用哪一种shell来执行
即这个脚本需要使用/bin/bash解释器来执行
shell脚本中for循环语法
1、列表循环
用于将一组命令循环执行已知的次数
for variable in {list}
do
command
command
…
done
如:
[root@localhost shell]# for i in {1..5};do echo $i;done
1
2
3
4
5
2、不带列表循环
由用户指定的参数和参数的个数决定循环次数
for variable
do
command
command
…
done
执行过程:
for variable in "$@"
do
command
command
…
done
如:
[root@localhost shell]# cat for.sh
#!/bin/bash
for var
do
echo $var
done
[root@localhost shell]# ./for.sh a b c
a
b
c
3、类C风格的for循环
for(( expr1;expr2;expr3 ))
do
command
command
…
done
如:
for (( i=1;i<=5;i++))
do
echo $i
done
如何调试shell脚本
[root@MissHou shell01]# bash -x 1.sh
+ hostname #脚本本身的命令(有+)
MissHou.itcast.cc #执行结果
+ date
Sun Jul 22 14:43:20 CST 2018
-x:一般用于排错,查看脚本的执行过程
-n:用来查看脚本的语法是否有问题
shell脚本如何比较字符串
在 if 条件判断中使用下面的符号进行判断
-z 是否为空字符串 字符串长度为0,就成立
-n 是否为非空字符串 只要字符串非空,就是成立
string1 = string2 是否相等
string1 != string2 不等
shell脚本如何判断文件是否存在
在 if 条件判断中使用下面的符号进行判断
-e 是否存在 不管是文件还是目录,只要存在,条件就成立
-f 普通文件是否存在
-d 目录是否存在
-S socket
-p pipe
-c character
-b block
-L 软link
-s 文件是否有内容
三种语法格式:
test -e file 只要文件存在条件为真
[ -d /shell01/dir1 ] 判断目录是否存在,存在条件为真
[ ! -d /shell01/dir1 ] 判断目录是否存在,不存在条件为真
[[ -f /shell01/1.sh ]] 判断文件是否存在,并且是一个普通的文件
bash中有哪些特殊的变量
$?:上一条命令执行后返回的状态,当返回值为0时表示执行成功,非0值表示执行失败
$$:当前进程的进程号
$!:后台运行的最后一个进程号
!$ 调用历史中最后一条命令的参数
!! 调用历史中最后一条命令
$#:脚本后面接的参数的个数
$*:脚本后面所有参数,参数当成一个整体输出
$@: 脚本后面所有参数,参数是独立的
$0:当前执行的进程/脚本名
$1~$9 位置参数变量
${10}~${n} 扩展位置参数变量 第10个位置变量必须用{}大括号括起来
在shell脚本中,如何写入注释
每一行注释以#开头
如何让 shell 脚本得到来自终端的输入
read命令可以读取来自终端用户的输入并置于给出的变量中
如:
[root@localhost shell]# read -p "Input your name:" name
Input your name:harry
[root@localhost shell]# echo $name
harry
如何取消变量
如何执行算术运算
Bash shell 的算术运算有四种方式:
1. 使用 $(( )) $((1+1))
2. 使用$[ ] $[1+1]
3. 使用 expr 外部程式 expr 1 + 1
4. 使用 let 命令 let n+=1
在shell脚本如何定义函数
函数名()
{
函数体(一堆命令的集合,来实现某个功能)
}
或者
function 函数名()
{
函数体(一堆命令的集合,来实现某个功能)
}
如何向脚本传递参数
在执行脚本时把参数写在脚本后面
在脚本里面通过 $1 来表示这个参数
如 在显示文件名称的脚本中:
[root@localhost shell]# ./show.sh file1.txt
[root@localhost shell]# cat show.sh
#!/bin/bash
cat $1
如何在脚本中使用参数
$1:第一个参数,$2:第二个参数...
如 在复制文件的脚本中:
脚本会复制文件(arg1) 到目标地址(arg2)
[root@localhost shell]# ./copy.sh file1.txt /tmp/
[root@localhost shell]# cat copy.sh
#!/bin/bash
cp $1 $2
如何计算传递进来的参数
如何在脚本中获取脚本名称
如何检查之前的命令是否运行成功
如何获取文件的最后一行
如何获取文件的第一行
如何获取一个文件每一行的第三个元素
假如文件中每行第一个元素是 FIND,如何获取第二个元素
awk '{ if ($1 == "FIND") print $2}'
如何获取文本文件的第 10 行
sed -n '10p' file
或
head -10 file|tail -1
bash 脚本文件的第一个符号是什么
命令:[ -z "" ] && echo 0 || echo 1 的输出是什么
命令 “export” 有什么用
将当前变量变成环境变量(临时)
环境变量:当前进程有效,并且能够被子进程调用。
如何在后台运行脚本
方法一:
在执行脚本命令的最后增加一个&符号
如
可以看到[1] 13641的回显说明脚本在后台执行了
方法二:
在执行脚本命令的前面使用nohup命令,结尾追加&符号
如
用于不中断的在后台执行脚本
“chmod 500 script” 做什么
使脚本所有者拥有可执行权限
& 和 && 有什么区别
& – 希望脚本在后台运行的时候使用它
&& – 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它
命令: name=John && echo ‘My name is $name’ 的输出是什么
如何只用 echo 命令获取字符串变量的一部分
如:
variable="My name is Petras, and I am developer."
echo ${variable:11:6}
会显示 Petras