40 个简单又有效的 Linux Shell 脚本示例
转自:入门小站 作者:执着的花猫 Jp
历史上,shell 一直是类 Unix 系统的本地命令行解释器。它已被证明是 Unix 的主要功能之一,并发展成为一个全新的主题。Linux 提供了各种功能强大的 shell,包括 Bash、Zsh、Tcsh 和 Ksh。这些外壳最令人惊讶的特性之一是其可编程性。创建简单而有效的 Linux shell 脚本来处理日常工作非常容易。
1.Hello World
程序员经常通过学习 hello world 程序来学习新语言。这是一个简单的程序,将字符串 “HelloWorld” 打印到标准输出中。然后,使用 vim 或 nano 等编辑器创建 hello-world.sh 文件,并将以下行复制到其中。
#!/bin/bash
echo "Hello World"
保存并退出文件。接下来,您需要使用以下命令使该文件可执行。
$ chmod a+x hello-world.sh
可以使用以下两个命令中的任何一个来运行此命令。
$ bash hello-world.sh
$ ./hello-world.sh
它将打印出传递给脚本内部回显的字符串。
2.使用 echo 打印
echo 命令用于在 bash 中打印信息。它类似于 C 函数 “printf”,并提供了许多常见选项,包括转义序列和重定向。将以下行复制到名为 echo.sh 的文件中,并使其可执行,如上所述。
#!/bin/bash
echo "Printing text"
echo -n "Printing text without newline"
echo -e "\nRemoving \t special \t characters\n"
运行脚本以查看其功能。-e 选项用于告诉 echo 传递给它的字符串包含特殊字符,需要扩展功能。
3.使用注释
注释对文档很有用,是高质量代码库的要求。将注释放在处理关键逻辑的代码中是一种常见的做法。要注释掉一行,只需在其前面使用 #(hash)字符。例如,请查看下面的 bash 脚本示例。
#!/bin/bash
# Adding two values
((sum=25+35))
#Print the result
echo $sum
此脚本将输出数字 60。首先,在某些行之前使用 #检查注释的使用方式。不过,第一行是一个例外。它被称为 shebang,让系统知道在运行这个脚本时要使用哪个解释器。
4.多行注释
许多人使用多行注释来记录他们的 shell 脚本。在下一个名为 comment.sh 的脚本中检查这是如何完成的。
#!/bin/bash
: '
This script calculates
the square of 5.
'
((area=5*5))
echo $area
注意多行注释是如何放置在内部的:“和” 字符。
5.While 循环
while 循环构造用于多次运行某些指令。查看以下名为 while.sh 的脚本,以更好地理解此概念。
#!/bin/bash
i=0
while [ $i -le 2 ]
do
echo Number: $i
((i++))
done
因此,while 循环采用以下形式。
while [ condition ]
do
commands 1
commands n
done
方括号周围的空格是必填的。
6.For 循环
for 循环是另一种广泛使用的 bashshell 构造,它允许用户高效地迭代代码。下面演示了一个简单的示例。
#!/bin/bash
for (( counter=1; counter<=10; counter++ ))
do
echo -n "$counter "
done
printf "\n"
7.接收用户输入
#!/bin/bash
echo -n "Enter Something:"
read something
echo "You Entered: $something"
8.If 语句
if CONDITION
then
STATEMENTS
fi
只有当条件为真时,才会执行这些语句。fi 关键字用于标记 if 语句的结尾。下面显示了一个快速示例。
> #!/bin/bash
> echo -n "Enter a number:"
> read num
> if [[$num -gt 10]]
> then
> echo "Number is greater than 10."
> fi
如果通过输入提供的数字大于 10,上述程序将仅显示输出。-gt 表示大于;类似地 - lt 表示小于 - le 表示小于等于;且 - ge 表示大于等于。此外,还需要 [[]]。
9.使用 If Else 进行更多控制
将 else 构造与 if 结合起来,可以更好地控制脚本的逻辑。下面显示了一个简单的示例。
#!/bin/bash
read n
if [ $n -lt 10 ];
then
echo "It is a one digit number"
else
echo "It is a two digit number"
fi
其他部分需要放在 if 的动作部分之后和 fi 之前。
10.使用 AND 运算符
AND 运算符允许我们的程序检查是否同时满足多个条件。由 AND 运算符分隔的所有部分必须为 true。否则,包含 AND 的语句将返回 false。查看下面的 bash 脚本示例,以更好地了解 AND 的工作原理。
#!/bin/bash
echo -n "Enter Number:"
read num
if [[ ( $num -lt 10 ) && ( $num%2 -eq 0 ) ]]; then
echo "Even Number"
else
echo "Odd Number"
fi
AND 运算符由 && 符号表示。
11.使用 OR 运算符
OR 运算符是另一个关键的构造,它允许我们在脚本中实现复杂、健壮的编程逻辑。与 AND 相反,当 OR 运算符的任一操作数为真时,由 OR 运算符组成的语句返回真。仅当由 OR 分隔的每个操作数为假时,它才返回假。
#!/bin/bash
echo -n "Enter any number:"
read n
if [[ ( $n -eq 15 || $n -eq 45 ) ]]
then
echo "You won"
else
echo "You lost!"
fi
这个简单的示例演示了 OR 运算符如何在 Linuxshell 脚本中工作。只有当用户输入数字 15 或 45 时,它才会宣布用户为获胜者。|| 符号表示 OR 运算符。
12.使用 El if
elif 语句代表 else if,并为实现链逻辑提供了一种方便的方法。通过评估以下示例,了解 elif 的工作原理。
#!/bin/bash
echo -n "Enter a number: "
read num
if [[ $num -gt 10 ]]
then
echo "Number is greater than 10."
elif [[ $num -eq 10 ]]
then
echo "Number is equal to 10."
else
echo "Number is less than 10."
fi
上面的程序是不言自明的,所以我们不会逐行剖析它。相反,更改脚本中的变量名称和值等部分,以检查它们如何一起工作。
13.case 条件
. switch 构造是 Linux bash 脚本提供的另一个强大功能。它可以用于需要嵌套条件的地方,但不希望使用复杂的 if-else elif 链。看看下一个例子。
#!/bin/bash
echo -n "Enter a number: "
read num
case $num in
100)
echo "Hundred!!" ;;
200)
echo "Double Hundred!!" ;;
*)
echo "Neither 100 nor 200" ;;
esac
条件写在 case 和 esac 关键字之间。*)用于匹配除 100 和 200 以外的所有输入。
14.命令行参数
在许多情况下,直接从命令 shell 获取参数是有益的。下面的示例演示了如何在 bash 中执行此操作。
#!/bin/bash
echo "Total arguments : $#"
echo "First Argument = $1"
echo "Second Argument = $2"
运行此脚本时,在其名称后添加两个附加参数。我将其命名为 test.sh,调用过程概述如下。
$ ./test.sh Hey Howdy
15.使用名称获取参数
#!/bin/bash
for arg in "$@"
do
index=$(echo $arg | cut -f1 -d=)
val=$(echo $arg | cut -f2 -d=)
case $index in
X) x=$val;;
Y) y=$val;;
*)
esac
done
((result=x+y))
echo "X+Y=$result"
$ ./test.sh X=44 Y=100
16.连接字符串
#!/bin/bash
string1="Ubuntu"
string2="Pit"
string=$string1$string2
echo "$string is a great resource for Linux beginners."
17.字符串截取
#!/bin/bash
Str="Learn Bash Commands from UbuntuPit"
subStr=${Str:0:20}
echo $subStr
18.使用 cut 做截取
#!/bin/bash
Str="Learn Bash Commands from UbuntuPit"
#subStr=${Str:0:20}
subStr=$(echo $Str| cut -d ' ' -f 1-3)
echo $subStr
19.添加两个值
#!/bin/bash
echo -n "Enter first number:"
read x
echo -n "Enter second number:"
read y
(( sum=x+y ))
echo "The result of addition=$sum"
20.添加多个值
#!/bin/bash
sum=0
for (( counter=1; counter<5; counter++ ))
do
echo -n "Enter Your Number:"
read n
(( sum+=n ))
#echo -n "$counter "
done
printf "\n"
echo "Result is: $sum"
21.Bash 中的函数
#!/bin/bash
function Add()
{
echo -n "Enter a Number: "
read x
echo -n "Enter another Number: "
read y
echo "Adiition is: $(( x+y ))"
}
Add
22.具有返回值的函数
#!/bin/bash
function Greet() {
str="Hello $name, what brings you to UbuntuPit.com?"
echo $str
}
echo "-> what's your name?"
read name
val=$(Greet)
echo -e "-> $val"
23.从 Bash 脚本创建目录
#!/bin/bash
echo -n "Enter directory name ->"
read newdir
cmd="mkdir $newdir"
eval $cmd
`mkdir $newdir`
24.确认存在后创建目录
#!/bin/bash
echo -n "Enter directory name ->"
read dir
if [ -d "$dir" ]
then
echo "Directory exists"
else
`mkdir $dir`
echo "Directory created"
fi
25.读取文件
1. Vim
2. Emacs
3. ed
4. nano
5. Code
#!/bin/bash
file='editors.txt'
while read line; do
echo $line
done < $file
26.删除文件
#!/bin/bash
echo -n "Enter filename ->"
read name
rm -i $name
27.附加到文件
#!/bin/bash
echo "Before appending the file"
cat editors.txt
echo "6. NotePad++" >> editors.txt
echo "After appending the file"
cat editors.txt
28.测试文件存在
#!/bin/bash
filename=$1
if [ -f "$filename" ]; then
echo "File exists"
else
echo "File does not exist"
fi
29.从 Shell 脚本发送邮件
#!/bin/bash
recipient=”[email protected]”
subject=”Greetings”
message=”Welcome to UbuntuPit”
`mail -s $subject $recipient <<< $message`
30.解析日期和时间
#!/bin/bash
year=`date +%Y`
month=`date +%m`
day=`date +%d`
hour=`date +%H`
minute=`date +%M`
second=`date +%S`
echo `date`
echo "Current Date is: $day-$month-$year"
echo "Current Time is: $hour:$minute:$second"
31.sleep 命令
#!/bin/bash
echo "How long to wait?"
read time
sleep $time
echo "Waited for $time seconds!"
32.wait 命令
#!/bin/bash
echo "Testing wait command"
sleep 5 &
pid=$!
kill $pid
wait $pid
echo $pid was terminated.
33.显示上次更新的文件
#!/bin/bash
ls -lrt | grep ^- | awk 'END{print $NF}'
34.添加批处理扩展
#!/bin/bash
dir=$1
for file in `ls $1/*`
do
mv $file $file.UP
done
35.打印文件或目录的数量
#!/bin/bash
if [ -d "$@" ]; then
echo "Files found: $(find "$@" -type f | wc -l)"
echo "Folders found: $(find "$@" -type d | wc -l)"
else
echo "[ERROR] Please retry with another folder."
exit 1
fi
36.清理日志文件
#!/bin/bash
LOG_DIR=/var/log
cd $LOG_DIR
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."
37.使用 Bash 备份脚本
#!/bin/bash
BACKUPFILE=backup-$(date +%m-%d-%Y)
archive=${1:-$BACKUPFILE}
find . -mtime -1 -type f -print0 | xargs -0 tar rvf "$archive.tar"
echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."
exit 0
38.检查你是否是 root 用户
#!/bin/bash
ROOT_UID=0
if [ "$UID" -eq "$ROOT_UID" ]
then
echo "You are root."
else
echo "You are not root"
fi
exit 0
39.从文件中删除重复行
#! /bin/sh
echo -n "Enter Filename-> "
read filename
if [ -f "$filename" ]; then
sort $filename | uniq | tee sorted.txt
else
echo "No $filename in $pwd...try again"
fi
exit 0
40.系统维护
#!/bin/bash
echo -e "\n$(date "+%d-%m-%Y --- %T") --- Starting work\n"
apt-get update
apt-get -y upgrade
apt-get -y autoremove
apt-get autoclean
echo -e "\n$(date "+%T") \t Script Terminated"
END
官方站点:www.linuxprobe.com
Linux命令大全:www.linuxcool.com
刘遄老师QQ:5604215
Linux技术交流群:3861509
(新群,火热加群中……)
想要学习Linux系统的读者可以点击"阅读原文"按钮来了解书籍《Linux就该这么学》,同时也非常适合专业的运维人员阅读,成为辅助您工作的高价值工具书!
微信扫码关注该文公众号作者