Shell脚本是什么
一个Shell脚本是一个文本文件,包含一个或多个命令。
作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些命令在一个文本文件(Shell脚本)来完成这些日常工作任务。
什么是默认登录Shell,如何改变指定用户的登录Shell
在Linux操作系统,“/bin/bash”是默认登陆shell,是在创建用户时分配的。使用chsh命令可改变默认的shell
可在Shell脚本中使用哪些类型的变量
两种类型的变量:
系统定义变量
用户定义变量
“set”命令或 echo $变量名 可查看变量值
特殊变量
test.sh文件中
运行结果:
“#!/bin/bash”的作用
这是shell脚本的第一行,成为(shebang)行,这里#叫做hash,!叫做bang
它的意思是命令通过/bin/bash来执行
如何使脚本可执行
chmod u+x test.sh
如何加入注释
注释以#开头
如何取消变量或变量赋值
unset 变量名
如何让shell就脚本得到来自终端的输入
read命令得到用户的输入并置于你给出的变量中
if
if [ 条件 ];then
命令1
命令2
...
elif [ 条件 ];then
命令1
命令2
...
else
if [ 条件 ];then
命令1
命令2
...
else
命令1
命令2
...
fi
fi
test.sh:
printf "Please Enter Your Name: " read name printf "Please Enter Your score: " read score #[[ $score -lt 90 ]] || { [ $score -lt 90 ] || { echo "hi,$name,you are very good!" } if [ $score -ge 90 ];then echo "hi ${name},you are very good!" elif [ $score -ge 80 -a $score -lt 90 ];then echo "hi $name,you are good!" elif [ $score -ge 60 -a $score -lt 80 ];then echo "hi $name,you are normal!" else echo "who are you??" fi
运行结果:
for
for 变量 in 循环列表
do
命令1
命令2
...
done
test.sh:
for i in {a..z} do if [ -b /dev/sd${i} ];then echo "yes!,disk id /dev/sd${i}" fi done
运行结果:
test.sh:
sum=0 for i in {1..100} do let sum+=i done echo "$sum"
运行结果:
5050
test.sh:
sum=0 for (( i=0; i<=100; i++ )) do let sum+=i done echo $sum
运行结果:
5050
while
while [ 条件 ]
do
命令
done
test.sh:
while [ $# -gt 0 ] do echo $1 shift 1 done
运行结果:
do-while
do
{
命令
}while(条件)
case
case 变量 in
值1)
命令
;;
值2)
命令
;;
*)
命令
;;
esac
test.sh:
case "$1" in start | -s | -S ) echo "your cmd is start" ;; st[oO]p ) echo "your cmd is stop" ;; restart ) echo "your cmd is restart" ;; * ) echo "your cmd is default" ;; esac
运行结果:
until
test.sh:
i=0 sum=0 until [ $i -gt 100 ] do let sum+=i let i++ done echo $sum
运行结果:
5050
shell脚本中“$?”标记的用途是什么
在写一个shell脚本时,如果你想要检查前一条命令是否执行成功,“$?”可以来检查前一条命令的结束状态,0为成功
在shell脚本中如何比较两个数字
可用test 或[ 测试,如:
#!/bin/bash x=10 y=20 if [ x -gt y ];then echo "x > y" else echo "y <= x" fi
在shell脚本中如何比较两个字符串
test.sh:
str="hello WORLD" [ "X$str" == "Xhello world" -o "X$str" == "Xhello WORLD" ] echo $? [ "X$str" == "Xhello WORLD" -a -f "test.sh" -a -d "dir" -a ! "Xstr" == "Xhello bit" ] echo $?
结果:
test.sh:
read str [ "X$str" == "X" ] echo $? [ -z "$str" ] echo $? [ ! -z "$str" ] echo $? [ -n "$str" ] echo $? [ ! -n "$str" ] echo $? [ ! "X$str" != "Xhello" ] echo $?
结果:
在shell脚本中,如何测试文件
test命令 或[命令 ,举例如下:
[ -d 文件名 ]
[ -d "$str" ]
其中-d表示如果文件存在且是目录,返回true,当然也可以是别的选项,不止-d
-e表示如果文件存在,返回true
-f表示如果文件存在且是普通文件,返回true
-r表示如果文件存在并且可读,返回true
-s表示如果文件存在且不为空,返回true
-w表示如果文件存在并且可写,返回true
-x表示如果文件存在并且可执行,返回true
如何执行算术运算
两种方法:
1、使用expr命令
2、$[ 表达式 ],如:
如何将标准输出和错误输出重定向到同一位置
1、如 ls /usr/share/doc > out.txt 2>&1
2、如 ls /usr/share/doc &> out.txt
在shell脚本中如何定义函数
函数是拥有名字的代码块。当我们定义代码块,我们就可以在我们的脚本调用函数名字,该代码块就会被执行。
function 函数名(){
命令
return 0
}
如何调试shell脚本
1、使用‘-x’参数(bash -x test.sh)
2、使用 '-nv'参数(bash -nv test.sh)
-n,读一遍脚本中的命令但不执行,用于检查脚本中的语法错误。
-v,一边执行脚本,一边将执行过的脚本命令打印到标准错误输出。
-x,提供跟踪执行信息,将执行的每一条命令和结果依次打印出来。
调试方法:
(1) 命令行提供参数
(2) 脚本开头提供参数
#! /bin/bash -x
(3) 脚本中用set命令启用或禁用调试选项
#!/bin/bash
foo() { echo "Shell bash function iscalled"; }
echo "---start--"
set -v
foo
set +v
echo"---end--"
set -v和set+v分别表示启用和禁用-x参数,这样可以只对脚本中的某一段进行跟踪调试。
下面有三段代码
1.
#!/bin/sh
cd ..
ls
其中cd是Shell的内建命令,ls不是Shell的内建命令(可以用which ls查看)
则Shell执行此脚本的过程如下:
交互Shell(bash)fork/exec一个子Shell(sh)用于执行脚本,父进程bash等待子进程sh终止。
sh读取脚本中的cd..命令,调用相应的函数执行内建命令,改变当前工作目录为上一级目录。
sh读取脚本中的ls命令,fork/exec这个程序,列出当前工作目录下的文件,sh等待ls终止。
ls终止后,sh继续执行,读到脚本文件末尾,sh终止。
sh终止后,bash继续执行,打印提示符等待用户输入。
2.
VAR=45
echo $(($VAR/3))
echo $((16#2a))
3.
DATA=`date`
echo ${DATA}
echo $DATA
DATA=$(date)
echo $DATA
echo the last sunday is $(date -d "last sunday" +%Y-%m-%d)
《完》
转载于:https://blog.51cto.com/lingdandan/1789336