侧边栏

学习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 显示执行的语句

posted @ 2021-07-19 08:18  探针一号  阅读(45)  评论(0编辑  收藏  举报