Shell 编程的语法主要分为以下五个环节:变量、字符串、运算符、流程控制和函数五大部分。
变量名中不能用 $
(在 Shell 中表示引用)。
变量名和等号之间不能有空格。
username="张三"
可以使用字母、数字和下划线,但首字母不能是数字。
不能使用 Bash 的关键字。
不能使用标点符号,变量名中间不能有空格。
使用已定义的 Shell 变量时,在变量名前加 $
。
yourname=zhangsan
myname=lisi
echo $yourname
echo ${yourname} # 加花括号可以识别变量边界
定义后不可修改或删除。
readonly yourname
普通变量可以使用 unset
删除,只读变量不能删除。
unset myname
单引号:无法解析变量或转义字符,内容按原样输出。
skill='java'
str='I am good at $skill'
echo $str # 输出:I am good at $skill
双引号:可以包含变量和转义字符。
skill='java'
str="I am good at $skill"
echo $str # 输出:I am good at java
skill='java'
echo ${#skill} # 输出:4
skill='I like Java'
echo ${skill:2} # 从第 2 个字符开始截取
# 输出:like Java
echo ${skill:2:2} # 从第 2 个字符开始,截取 2 个字符
# 输出:li
查找 like
字符串中 i
的位置。
skill='like'
echo `expr index "$skill" i` # 输出:2
使用 expr
执行加减乘除运算,注意:
#!/bin/bash
a=8
b=9
# 加法
echo `expr $a + $b` # 输出:17
# 乘法(需转义 `*`)
echo `expr $a \* $b` # 输出:72
# 取余
echo `expr $b % $a` # 输出:1
运算符 | 含义 |
---|---|
-eq |
等于 |
-ne |
不等于 |
-lt |
小于 |
-le |
小于等于 |
-gt |
大于 |
-ge |
大于等于 |
Linux 使用 3 组二进制数表示文件权限:
000
:无权限。777
:全部权限。#!/bin/bash
if [ "$1"x = "gu"x ]
then
echo "welcome, gu"
fi
if [ $2 -lt 18 ]
then
echo "未成年人"
elif [ $2 -lt 35 ]
then
echo "青年人"
elif [ $2 -lt 60 ]
then
echo "中年人"
else
echo "老年人"
fi
#!/bin/bash
case $1 in
1)
echo "one"
;;
2)
echo "two"
;;
3)
echo "three"
;;
*)
echo "number else"
;;
esac
#!/bin/bash
for IP in `cat /root/for/ip.txt`
do
ping -c 3 -i 0.2 -w 3 $IP &>/dev/null
if [ $? -eq 0 ]; then
echo "host $IP is up"
else
echo "host $IP is down"
fi
done
#!/bin/sh
counter=5
factorial=1
while [ $counter -gt 0 ]
do
factorial=$(( $factorial * $counter ))
((counter--))
done
echo $factorial
#!/bin/bash
fun1 (){
echo "这是一个函数"
}
fun1
#!/bin/bash
NIC=$1
echo -e " In ------ Out"
while true; do
OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
sleep 1
NEW_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
IN=$(printf "%.1f%s" "$((($NEW_IN-$OLD_IN)/1024))" "KB/s")
OUT=$(printf "%.1f%s" "$((($NEW_OUT-$OLD_OUT)/1024))" "KB/s")
echo "$IN $OUT"
sleep 1
done
#/bin/bash
# 设置时区并同步时间
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
if ! crontab -l |grep ntpdate &>/dev/null ; then
(echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) |crontab
fi
# 禁用selinux
sed -i '/SELINUX/{s/permissive/disabled/}' /etc/selinux/config
# 关闭防火墙
if egrep "7.[0-9]" /etc/redhat-release &>/dev/null; then
systemctl stop firewalld
systemctl disable firewalld
elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null; then
service iptables stop
chkconfig iptables off
fi
# 历史命令显示操作时间
if ! grep HISTTIMEFORMAT /etc/bashrc; then
echo 'export HISTTIMEFORMAT="%F %T `whoami` "' >> /etc/bashrc
fi
# SSH超时时间
if ! grep "TMOUT=600" /etc/profile &>/dev/null; then
echo "export TMOUT=600" >> /etc/profile
fi
# 禁止root远程登录
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
# 禁止定时任务向发送邮件
sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab
# 设置最大打开文件数
if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
EOF
fi
# 系统内核优化
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_tw_buckets = 20480
net.ipv4.tcp_max_syn_backlog = 20480
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_fin_timeout = 20
EOF
# 减少SWAP使用
echo "0" > /proc/sys/vm/swappiness
# 安装系统性能分析工具及其他
yum install gcc make autoconf vim sysstat net-tools iostat if
#!/bin/bash
fun1(){
echo "我的第一个函数"
echo "参数1:$1"
echo "参数2:$2"
echo "参数3:$3"
echo "获取所有参数"
echo "$*"
echo "$@"
}
fun1 aa bb cc
#!/bin/bash
score=40
fun1(){
echo "成绩判断函数"
if [ $score -gt 60 ] ; then
echo "及格"
else
echo "不及格"
fi
}
fun1 score
#!/bin/bash
score=40
fun1(){
echo "成绩判断函数"
if [ $score -ge 90 ] ; then
echo "A"
elif [ $score -ge 80 ] ; then
echo "B"
elif [ $score -ge 70 ] ; then
echo "C"
elif [ $score -ge 60 ] ; then
echo "D"
else
echo "E"
fi
}
fun1 score
#!/bin/bash
fun1(){
echo "遍历函数"
for i in 1 2 3 4 5; do
echo $i
done
}
fun1
#!/bin/bash
fun1(){
echo "遍历函数"
for i in {1..100}; do
echo $i
done
}
fun1
#!/bin/bash
fun1(){
echo "遍历函数"
for i in {1..100..2}; do
echo $i
done
}
fun1
#!/bin/bash
fun1(){
echo "遍历函数"
for f in `ls /`; do
echo $f
done
}
fun1
#!/bin/bash
fun1(){
echo "计算 1-100 的累加和"
sum=0
i=1
while [ $i -le 100 ]; do
sum=$(( sum + i ))
i=$(( i + 1 ))
done
echo $sum
}
fun1
#!/bin/bash
fun1(){
echo "无限循环打印 hello"
for((;;))
do
echo "hello"
sleep 1
done
}
fun1
#!/bin/bash
fun1(){
echo "请输入 1-4 的关键字"
read anum
case $anum in
1) echo "你选择了 1" ;;
2) echo "你选择了 2" ;;
3) echo "你选择了 3" ;;
4) echo "你选择了 4" ;;
*) echo "无效选择" ;;
esac
}
fun1
#!/bin/bash
fun1(){
echo "每过一秒打印当前日期,执行十次停止"
i=0
while true;
do
sleep 1
echo $i $(date +"%Y-%m-%d %H:%M:%S")
i=$(( i + 1 ))
if [ $i -eq 10 ]; then
break
fi
done
}
fun1
#!/bin/bash
fun1(){
echo "打印 1-30,跳过 3 的倍数"
for i in {1..30}; do
if [ $(( i % 3 )) -eq 0 ]; then
continue
fi
echo $i
done
}
fun1