- Shell格式
1、擴展名: xxx.sh
2、正文第一行必須指定解釋器: #!/bin/bash
- shell執行方式
# 方式一: 加權限, ./xxx.sh 執行
1、chmod +x xxx.sh
2、./xxx.sh
# 方式二: 手動指定解釋器
bash xxx.sh
- 自定義變量
# 1. 定義變量
變量名=值 ----> 注意: =兩側絕對不能有空格
eg1: name="take me to your heart"
# 2. 調用變量的格式
echo $變量名
# 01_variable_1.sh
name="風云雄霸天下"
echo $name
# 3. 小細節: 單引號和雙引號的區別
單引號: 無法獲取變量的值
雙引號: 可以獲取變量的值
- 環境變量+位置變量+預設變量
# 環境變量
echo $USER -- 當前用戶
echo $UID -- 當前用戶的UID號
echo $PWD -- 當前路徑
echo $PATH -- 命令搜索路徑
# 位置變量
$1 $2 $3 ... ... shell的位置變量
# 預定義變量
$# $* $?
# $? : 返回上一條命令執行的狀態(0代表正確,非0代表失敗)
練習
輸出$1+$2,例如輸出結果: 3+5
#!/bin/bash
echo $1+$2
- 變量賦值 - 接收用戶從終端輸入的值
# 語法格式
read -p 提示信息 變量名
# 05_read.sh
#!/bin/bash
read -p 請輸入姓名: name
echo "您輸入的姓名是:$name"
# 指定超時時間
read -p 提示信息 變量名
read -t n -p 提示信息 變量名
# 06_read_t.sh 限制3秒中之內必須輸入值
#!/bin/bash
read -t 3 -p 請輸入用戶名: username
練習
1、輸入學生姓名: 趙敏
2、輸入學生成績: 88
3、輸出: 趙敏的成績為88分
Ubuntu設置sudo免密碼
# 通過更改 /etc/sudoers 實現
1、備份: sudo cp /etc/sudoers .
2、修改: sudo vi /etc/sudoers
添加: tarena ALL=(ALL) NOPASSWD : ALL
練習
請使用位置變量的方式實現用戶名的創建
#!/bin/bash
sudo useradd $1
echo "$1創建成功"
運行: ./文件名 用戶名
# 創建用戶名: useradd 用戶名
# 刪除用戶名:userdel 用戶名
- shell - 算術運算符
# 運算符
1、+ - * / %
2、++ : 自加1運算,類似于python中 i+=1
3、-- : 同++
# 運算命令
1、let 運算表達式
i=1
let i++
echo $i
2、expr 運算表達式
i=1
sum=`expr $i + 5` # +兩側要有空格
echo $sum
3、$[]
echo $[1+1]
echo $[1-1]
echo $[a+a] # 調用變量不用多次添加$符號
echo $[1*1] # 乘法無需轉義
練習
使用 位置變量+以上方法一、二中任何一種,實現2個數字的相加
#!/bin/bash
echo $[$1+$2]
echo `expr $1 + $2`
- shell - 比較運算符
# 語法格式
[ 判斷語句 ] # 注意括號必須有空格
# 組合
&& 并且
|| 或者
A命令 && B命令 //僅當A成功時才執行B
A命令 || B命令 //僅當A失敗時才執行B
思考: [ a == a ] && echo Y || echo N 代表什么意思?
#Y
# 1、字符比較
[ A == A ] #相等(等號兩邊需要有空格)
[ A != B ] #不相等
[ -z $變量 ] #判斷是否為空
思考(Y 還是 N): [ $USER == tarena ] && echo Y || echo N
練習: 用戶輸入用戶名,判斷是否為空,不為空時創建,否則直接退出程序
#!/bin/bash
read -p "請輸入用戶名:" username
[ -z $username ] && exit
sudo useradd $username
# 2、數字比較
-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 文件或目錄 ] #判斷是否可執行
思考輸出:
[ -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分支結構
# 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."
練習
使用shell編寫猜數字游戲,無須循環
# 計算機隨機出數字:computer=$RANDOM
#!/bin/bash
# 生成1-5直接的隨機數
num=$[RANDOM%5+1]
read -p "輸入你猜的數字:" 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循環
# 語法格式
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: 執行Linux命令,獲取結果
for i in `Linux命令`
# 示例4: 造數 seq
seq 1 2 10 # 1 3 5 7 9 (起始值 步長 終止值)
造數
seq 1 2 10 # 1 3 5 7 9 (起始值 步長 終止值)
seq 3 8 #3 4 5 6 7 8
練習
把猜數字游戲改為for循環,猜測100次
#!/bin/bash
#把猜數字游戲改為for循環,猜測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
# 練習:判斷指定網段的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 設置遠程連接
1. 開啟遠程連接 - 服務端
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
將如下行注釋掉
# bind-address 127.0.0.1
sudo service mysql restart
2. 授權用戶
mysql -uroot -p123456
mysql > grant all privileges on *.*to 'tiger'@'%'
c-for 循環
for ((賦初值;條件;步長))
do
執行命令
done
# 示例 打印1-5 之間的整數
for ((i=1;i<=5;i++))
do
echo $i
done
- while循環
# 語法格式
while 條件判斷
do
命令
done
# 示例
#!/bin/bash
i=1
while [ $i -lt 5 ]
do
echo $i
let i++
done
# 死循環
while:
do
執行命令
done
# 示例:
#!/bin/bash
# 簡陋的計時器
i=1
while :
do
echo $i
let i++
sleep 1
clear
done
文本處理工具-sed
# 1. 定義: 非交互式文本編輯器,逐行處理
# 2. 語法格式
sed [選項] '條件指令' 文件名
指令: 增刪改查
# 查詢 -> p
sed -n 'p' 17_sed.txt # 打印所有內容
sed -n '1p' 17_sed.txt #打印第1行內容
sed -n '1,3p' 17_sed.txt # 打印第1到3行內容
sed -n '1p;3p' 17_sed.txt # 打印1和3行內容
# 刪除 -> d
sed -i '1d' 17_sed.txt # 刪除第一行
sed -i '$d' 17_sed.txt # 刪除最后一行
# 改 -> c
sed -i '1c內容' 17_sed.txt #修改第1行
sed -i -e '1c李白' -e '3c杜甫' 17_sed.txt #修改第1和第3行
# 增加 -> a i
a : 在當前處理行的下一行插入
i: 在當前處理航的上一行插入
sed -i '1a李白' 17_sed.txt
# 替換 -> s
sed -i '條件/原內容/新內容/選項' 文件名
選項: g 表示全局替換 i 忽略字母大小寫
# 替換1到3行中的陶淵明
sed -i '1,3s/陶淵明/李白/' 17_sed.txt
# 替換每行中所有陶淵明,加g選項
sed -i '1,3s/陶淵明/李白/g' 17_sed.txt
練習
每隔1秒,從1個文件中隨機取1行,在大屏幕上顯示
# 1. 文件的行數,利用$RANDOM 想辦法取出隨機數
wc -l 17_sed.txt
sed -n '隨機數p'
# 代碼實現:
#!/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
判斷路徑是否存在
不存在:創建
已存在:不做操作