- Shell格式
1嘱蛋、擴(kuò)展名: xxx.sh
2矮冬、正文第一行必須指定解釋器: #!/bin/bash
- shell執(zhí)行方式
# 方式一: 加權(quán)限, ./xxx.sh 執(zhí)行
1废睦、chmod +x xxx.sh
2、./xxx.sh
# 方式二: 手動(dòng)指定解釋器
bash xxx.sh
- 自定義變量
# 1. 定義變量
變量名=值 ----> 注意: =兩側(cè)絕對(duì)不能有空格
eg1: name="take me to your heart"
# 2. 調(diào)用變量的格式
echo $變量名
# 01_variable_1.sh
name="風(fēng)云雄霸天下"
echo $name
# 3. 小細(xì)節(jié): 單引號(hào)和雙引號(hào)的區(qū)別
單引號(hào): 無法獲取變量的值
雙引號(hào): 可以獲取變量的值
- 環(huán)境變量+位置變量+預(yù)設(shè)變量
# 環(huán)境變量
echo $USER -- 當(dāng)前用戶
echo $UID -- 當(dāng)前用戶的UID號(hào)
echo $PWD -- 當(dāng)前路徑
echo $PATH -- 命令搜索路徑
# 位置變量
$1 $2 $3 ... ... shell的位置變量
# 預(yù)定義變量
$# $* $?
# $? : 返回上一條命令執(zhí)行的狀態(tài)(0代表正確,非0代表失敗)
練習(xí)
輸出$1+$2,例如輸出結(jié)果: 3+5
#!/bin/bash
echo $1+$2
- 變量賦值 - 接收用戶從終端輸入的值
# 語法格式
read -p 提示信息 變量名
# 05_read.sh
#!/bin/bash
read -p 請(qǐng)輸入姓名: name
echo "您輸入的姓名是:$name"
# 指定超時(shí)時(shí)間
read -p 提示信息 變量名
read -t n -p 提示信息 變量名
# 06_read_t.sh 限制3秒中之內(nèi)必須輸入值
#!/bin/bash
read -t 3 -p 請(qǐng)輸入用戶名: username
練習(xí)
1饮戳、輸入學(xué)生姓名: 趙敏
2、輸入學(xué)生成績(jī): 88
3、輸出: 趙敏的成績(jī)?yōu)?8分
Ubuntu設(shè)置sudo免密碼
# 通過更改 /etc/sudoers 實(shí)現(xiàn)
1温治、備份: sudo cp /etc/sudoers .
2、修改: sudo vi /etc/sudoers
添加: tarena ALL=(ALL) NOPASSWD : ALL
練習(xí)
請(qǐng)使用位置變量的方式實(shí)現(xiàn)用戶名的創(chuàng)建
#!/bin/bash
sudo useradd $1
echo "$1創(chuàng)建成功"
運(yùn)行: ./文件名 用戶名
# 創(chuàng)建用戶名: useradd 用戶名
# 刪除用戶名:userdel 用戶名
- shell - 算術(shù)運(yùn)算符
# 運(yùn)算符
1戒悠、+ - * / %
2熬荆、++ : 自加1運(yùn)算,類似于python中 i+=1
3、-- : 同++
# 運(yùn)算命令
1绸狐、let 運(yùn)算表達(dá)式
i=1
let i++
echo $i
2卤恳、expr 運(yùn)算表達(dá)式
i=1
sum=`expr $i + 5` # +兩側(cè)要有空格
echo $sum
3累盗、$[]
echo $[1+1]
echo $[1-1]
echo $[a+a] # 調(diào)用變量不用多次添加$符號(hào)
echo $[1*1] # 乘法無需轉(zhuǎn)義
練習(xí)
使用 位置變量+以上方法一、二中任何一種,實(shí)現(xiàn)2個(gè)數(shù)字的相加
#!/bin/bash
echo $[$1+$2]
echo `expr $1 + $2`
- shell - 比較運(yùn)算符
# 語法格式
[ 判斷語句 ] # 注意括號(hào)必須有空格
# 組合
&& 并且
|| 或者
A命令 && B命令 //僅當(dāng)A成功時(shí)才執(zhí)行B
A命令 || B命令 //僅當(dāng)A失敗時(shí)才執(zhí)行B
思考: [ a == a ] && echo Y || echo N 代表什么意思突琳?
#Y
# 1若债、字符比較
[ A == A ] #相等(等號(hào)兩邊需要有空格)
[ A != B ] #不相等
[ -z $變量 ] #判斷是否為空
思考(Y 還是 N): [ $USER == tarena ] && echo Y || echo N
練習(xí): 用戶輸入用戶名,判斷是否為空,不為空時(shí)創(chuàng)建,否則直接退出程序
#!/bin/bash
read -p "請(qǐng)輸入用戶名:" username
[ -z $username ] && exit
sudo useradd $username
# 2拆融、數(shù)字比較
-eq 等于(equal)
-ne 不等于(not equal)
-gt 大于(greater than)
-ge 大于等于(great or equal)
-lt 小于(less than)
-le 小于等于(less or equal)
思考輸出什么:
[ 10 -eq 10 ] && echo Y || echo N #Y
[ 11 -le 10 ] && echo Y || echo N #N
[ 12 -ge 3 ] && echo Y || echo N #Y
# 3蠢琳、文件|目錄比較
[ -e 文件或目錄 ] #是否存在exist
[ -f 文件 ] #存在且為文件file
[ -d 目錄 ] #存在且為目錄directory
[ -r 文件或目錄 ] #判斷是否可讀read
[ -w 文件或目錄 ] #判斷是否可寫write
[ -x 文件或目錄 ] #判斷是否可執(zhí)行
思考輸出:
[ -e /etc/passwd ] && echo Y || echo N #Y
[ -f /etc/passwd ] && echo Y || echo N #Y
[ -d /etc/passwd ] && echo Y || echo N # N
if分支結(jié)構(gòu)
# 1、單分支語法格式
if 判斷 ;then
命令
命令
fi
# 2镜豹、雙分支語法格式
if 判斷 ;then
命令1
else
命令2
fi
# 3傲须、多分支語法格式
if 判斷;then
命令1
elif 判斷 ;then
命令2
else
命令3
fi
# 示例
#!/bin/bash
if [ $USER == tarena ];then
echo "Yes,You are Tarena."
else
echo "You are other man."
練習(xí)
使用shell編寫猜數(shù)字游戲,無須循環(huán)
# 計(jì)算機(jī)隨機(jī)出數(shù)字:computer=$RANDOM
#!/bin/bash
# 生成1-5直接的隨機(jī)數(shù)
num=$[RANDOM%5+1]
read -p "輸入你猜的數(shù)字:" num_input
echo $num
if [ $num -eq $num_input ];then
echo "Well done!"
exit
elif [ $num_input -lt $num ];then
echo "Too small"
else
echo "Too big"
fi
- for循環(huán)
# 語法格式
for 變量 in 值序列
do
命令
done
# 示例
for i in 1 2 3 4 5
do
echo "hello world"
done
# 示例2: 1-8
for i in {1..8}
# 示例3: 執(zhí)行Linux命令,獲取結(jié)果
for i in `Linux命令`
# 示例4: 造數(shù) seq
seq 1 2 10 # 1 3 5 7 9 (起始值 步長(zhǎng) 終止值)
造數(shù)
seq 1 2 10 # 1 3 5 7 9 (起始值 步長(zhǎng) 終止值)
seq 3 8 #3 4 5 6 7 8
練習(xí)
把猜數(shù)字游戲改為for循環(huán),猜測(cè)100次
#!/bin/bash
#把猜數(shù)字游戲改為for循環(huán)趟脂,猜測(cè)100次
computer=$[RANDOM%10000+1]
for i in {1..30}
do
read -p "please guess:" guess
if [ $computer -eq $guess ];then
echo "Well done!"
exit
elif [ $computer -gt $guess ];then
echo "Too small"
else
echo "Too big"
fi
done
# 練習(xí):判斷指定網(wǎng)段的IP地址哪些可以用,哪些不能用泰讽?
#!/bin/bash
online=0
down=0
for i in {2..254}
do
ping -c 1 176.209.108.$i &> /dev/null #黑洞
if [ $? -eq 0 ];then
echo "176.209.108.$i onLine "
let online++
else
echo "176.209.108.$i Down"
let down++
fi
echo "Online : $online"
echo "Down : $down"
done
mysql 設(shè)置遠(yuǎn)程連接
1. 開啟遠(yuǎn)程連接 - 服務(wù)端
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
將如下行注釋掉
# bind-address 127.0.0.1
sudo service mysql restart
2. 授權(quán)用戶
mysql -uroot -p123456
mysql > grant all privileges on *.*to 'tiger'@'%'
c-for 循環(huán)
for ((賦初值;條件;步長(zhǎng)))
do
執(zhí)行命令
done
# 示例 打印1-5 之間的整數(shù)
for ((i=1;i<=5;i++))
do
echo $i
done
- while循環(huán)
# 語法格式
while 條件判斷
do
命令
done
# 示例
#!/bin/bash
i=1
while [ $i -lt 5 ]
do
echo $i
let i++
done
# 死循環(huán)
while:
do
執(zhí)行命令
done
# 示例:
#!/bin/bash
# 簡(jiǎn)陋的計(jì)時(shí)器
i=1
while :
do
echo $i
let i++
sleep 1
clear
done
文本處理工具-sed
# 1. 定義: 非交互式文本編輯器,逐行處理
# 2. 語法格式
sed [選項(xiàng)] '條件指令' 文件名
指令: 增刪改查
# 查詢 -> p
sed -n 'p' 17_sed.txt # 打印所有內(nèi)容
sed -n '1p' 17_sed.txt #打印第1行內(nèi)容
sed -n '1,3p' 17_sed.txt # 打印第1到3行內(nèi)容
sed -n '1p;3p' 17_sed.txt # 打印1和3行內(nèi)容
# 刪除 -> d
sed -i '1d' 17_sed.txt # 刪除第一行
sed -i '$d' 17_sed.txt # 刪除最后一行
# 改 -> c
sed -i '1c內(nèi)容' 17_sed.txt #修改第1行
sed -i -e '1c李白' -e '3c杜甫' 17_sed.txt #修改第1和第3行
# 增加 -> a i
a : 在當(dāng)前處理行的下一行插入
i: 在當(dāng)前處理航的上一行插入
sed -i '1a李白' 17_sed.txt
# 替換 -> s
sed -i '條件/原內(nèi)容/新內(nèi)容/選項(xiàng)' 文件名
選項(xiàng): g 表示全局替換 i 忽略字母大小寫
# 替換1到3行中的陶淵明
sed -i '1,3s/陶淵明/李白/' 17_sed.txt
# 替換每行中所有陶淵明,加g選項(xiàng)
sed -i '1,3s/陶淵明/李白/g' 17_sed.txt
練習(xí)
每隔1秒,從1個(gè)文件中隨機(jī)取1行,在大屏幕上顯示
# 1. 文件的行數(shù),利用$RANDOM 想辦法取出隨機(jī)數(shù)
wc -l 17_sed.txt
sed -n '隨機(jī)數(shù)p'
# 代碼實(shí)現(xiàn):
#!/bin/bash
file="17_sed.txt"
number=$(sed -n '$=' $file)
while :
do
clear
l=$[RANDOM%number+1]
sed -n "${l}p" $file
sleep 1
done
文件|目錄判斷示例
/home/tarena/libai
判斷路徑是否存在
不存在:創(chuàng)建
已存在:不做操作