学习shell script的笔记
学习shell script的笔记
shell script 是利用 shell 的功能所写的一个"程序",将一些 shell 的语法与指令(含外部指令)以纯文字方式写在里面, 搭配正则表达式、管道命令与数据流重定向等功能,以达到我们所想要的处理目的。
将 shell.sh 建立在~/bin/ 底下,如果有rx权限,直接输入shell.sh就能执行
此外,在本目录./shell.sh也可,bash .sh或sh .sh也可
写Shell Script
hello world
#!/bin/bash
# Ginger 2021.7.17
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Hello world ! \a \n"
exit 0
#!/bin/bash
是声明bashshell的
第二行的井号是注释
接着声明主要环境变量
最后完成主程序,告知结果,即exit 0
echo -e处理特殊字符,\n 换行且光标移至行首; \a 发出警告声;
来看鸟哥的一个例子
[dmtsai@study bin]$ vim create_3_filename.sh
#!/bin/bash
# Program:
# Program creates three files, which named by user's input and date command.
# History:
# 2015/07/16 VBird First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 1. 讓使用者輸入檔案名稱,並取得 fileuser 這個變數;
echo -e "I will use 'touch' command to create 3 files." # 純粹顯示資訊
read -p "Please input your filename: " fileuser # 提示使用者輸入
# 2. 為了避免使用者隨意按 Enter ,利用變數功能分析檔名是否有設定?
filename=${fileuser:-"filename"} # 開始判斷有否設定檔名
# 3. 開始利用 date 指令來取得所需要的檔名了;
date1=$(date --date='2 days ago' +%Y%m%d) # 前兩天的日期
date2=$(date --date='1 days ago' +%Y%m%d) # 前一天的日期
date3=$(date +%Y%m%d) # 今天的日期
file1=${filename}${date1} # 底下三行在設定檔名
file2=${filename}${date2}
file3=${filename}${date3}
# 4. 將檔名建立吧!
touch "${file1}" # 底下三行在建立檔案
touch "${file2}"
touch "${file3}"
一个根据日期和输入来建立文件的shell脚本
其中有一行比较难懂filename=${fileuser:-"filename"}
如果输入fileuser的有值的话,将该值付给filename
如果fileuser里面没有值,那么将”filename”赋予给filename。
详细在这里
[root@openeuler]在[~]笑着说:echo $(1+1)
-bash: 1+1: command not found
[root@openeuler]在[~]笑着说:echo $((1+1))
2
利用『 $((算式)) 』来进行数值运算
read -p "xxx " var
变量赋值
使用source执行脚本,可以让脚本在父程序生效
source .sh
一般来说,执行.sh时都是在子程序的bash里执行,不会影响父程序
而使用source执行.sh则可以
test 测试的命令,返回的0或1可以帮助接下来进行
中括号[]也可,注意加空格
-o 类比or
-a 类比and
! 反向
默认变量
/path/to/scriptname opt1 opt2 opt3 opt4
$0 $1 $2 $3 $4
$#
参数个数
$@
参数全部内容
shift 移动参数位置
if then
if [] ;then
xxxx
elif [] ;then
xxxx
else
xxxx
fi(结束if)
例子
read -p "Please input (Y/N): " yn
if [ "${yn}" == "Y" ] || [ "${yn}" == "y" ]; then
echo "OK, continue"
elif [ "${yn}" == "N" ] || [ "${yn}" == "n" ]; then
echo "Oh, interrupt!"
else
echo "I don't know what your choice is"
fi
整数比较:
-eq(equal) : 测试两个整数是否相等;比如 $A -eq $B
-ne(inequality) : 测试两个整数是否不等;不等,为真;相等,为假;
-gt(greter than) : 测试一个数是否大于另一个数;大于,为真;否则,为假;
-lt(less than) : 测试一个数是否小于另一个数;小于,为真;否则,为假;
-ge(greter equal): 大于或等于
-le(less equal) :小于或等于
case ... esac
case 值 in
内容1)
command1
command2
command3
;;
内容2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
function
function一定要在最前面
function fname() {
xxxx
}
function 若有参数
function printit(){
echo "Your choice is ${1}" # 這個 $1 必須要參考底下指令的下達
}
echo "This program will print your selection !"
case ${1} in
"one")
printit 1 # 請注意, printit 指令後面還有接參數!
;;
"two")
printit 2
;;
"three")
printit 3
;;
*)
echo "Usage ${0} {one|two|three}"
;;
esac
循环
while 和 until
while [ ]
do
xxxx
done (结束)
until [ ]
do
xxxx
done (结束)
for...do...done
for var in con1 con2 con3 ...
do
xxx
done
举个在当前目录建立50个文件夹的例子
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
for i in $(seq 1 50)
do
mkdir ${i}
done
查看某目录下全部文件的权限(思路)
filelist=$(ls ${dir})
for filename in ${filelist}
do
perm=""
test -r "${dir}/${filename}" && perm="${perm} readable"
test -w "${dir}/${filename}" && perm="${perm} writable"
test -x "${dir}/${filename}" && perm="${perm} executable"
echo "The file ${dir}/${filename}'s permission is ${perm} "
done
求和...
read -p "input: " nu
s=0
for (( i=1; i<=${nu}; i=i+1 ))
do
s=$((${s}+${i}))
done
调试
sh [] xx.shell
-n 查询语法问题但不执行
-x 显示执行的语句