#!/bin/bash //第一行指定此脚本使用的shell
set -- $(getopt -q ab:cd $@) //格式化命令行参数
trap "echo 我要捕获终止程序型号不让程序终止" SIGINT //捕获命令行信号
file_name=$HOME/sentinel
//if结构
if [ -f $file_name ] //通过判断命令的返回码来执行
then
if [ -s $file_name ]
then
echo "The $file_name file exists and has data in it"
echo "Will not remove this file"
else
echo "The $file_name file exists, but is empty"
rm $file_name
fi
else
echo "File,$file_name, does not exist."
fi
if [ -O /etc/passwd ]
then
echo "You are the owner of the /etc/passwd file"
else
echo "Sorry, you are not the owner of the /etc/passwd file"
fi
if [ $home/桌面/cTest -nt $file_name ]
then
echo "cTest 比 $file_name 更近"
else
echo "cTest 比 $file_name 更久"
fi
echo "双括号允许你在比较过程中使用高级数学表达式"
var1l=10
if (($var1l ** 2 >90))
then
echo "The square of $var1l is 100"
else
echo "calculate error"
fi
echo "双方括号提供了针对字符串比较的高级特性"
echo "双方括号中可以通过正则项进行模式匹配"
if [[ $USER == p* ]]
then
echo "Hello $USER"
else
echo " Sorry, I do not know you"
fi
echo
user=haha
case $user in rich | pengzheng )
echo "Welcome $user";;
lala)
echo "Special testing account";;
haha)
echo "Do not foret to log off when you are done";;
esac
for test in a b c d e f g h i
do
echo "The next value is $test"
done
echo The last value is $test
echo
//循环结构
list="a b c d e f g"
echo "通过在后面直接加双引号的方式连接字符串"
list=$list" h i"
for test in $list
do
echo "The next value if $test"
done
echo
echo "通过设置IFS=$'\n'来去除空格和制表符分数据段"
IFS.OLD=$IFS
IFS=$'\n'
for test in $(cat test.sh)
do
echo "a line $test"
done
echo "可以在for中包含多个目录通配符,将目录查找和列表合并进同一个for中"
for file in /home/pengzheng/* /home/pengzheng/桌面/*
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif [ -f "$file" ]
then
echo "$file is a file"
fi
done
IFS=$IFS.OLD
echo
var1=100
until [ $var1 -eq 0 ]
do
echo $var1
var1=$[ $var1 -25 ]
done
echo
#IFS.OLD=$IFS
#IFS=$'\n'
#for entry in $(cat /etc/passwd)
#do
#echo "Values in $entry -"
#IFS=:
# for value in $entry
# do
#echo " $value"
# done
#done
#IFS=IFS.OLD
echo "break n 指定跳出层级来跳出到第n层(从内往外数)循环"
echo
var1=5
until [ $var1 -eq 0 ]
do
echo "The outer loop is $var1"
for (( a=1; a<=4; a++ ))
do
echo "Iteration $a"
if [ $a -gt 3 ] && [ $var1 -lt 3 ]
then
echo "我要跳出去了,各单位注意var1=$var1:a=$a "
break 2
fi
done
var1=$[ $var1 - 1 ]
done >output.txt
echo "通过重定向将输出转到文件中去了,本次不会在屏幕上输出"
echo "cat output.txt 给你看看"
cat output.txt
echo "本次循环后通过管道重定向到排序后输出"
var1=5
until [ $var1 -eq 0 ]
do
echo "The outer loop is $var1"
for (( a=1; a<=4; a++ ))
do
echo "Iteration $a"
if [ $a -gt 3 ] && [ $var1 -lt 3 ]
then
echo "我要跳出去了,各单位注意var1=$var1:a=$a "
break 2
fi
done
var1=$[ $var1 - 1 ]
done | sort
#echo "获取可执行文件的列表"
#IFS.OLD=$IFS
#IFS=:
#for folder in $PATH
#do
# echo "查看$folder:文件"
# for file in $folder/*
# do
# if [ -x $file ]
# then
# echo " $file有可执行权限"
# fi
#done
#done
#IFS=$IFS.OLD
//命令行参数描述符
total=$[ $1*$2 ]
echo the first parameter is $1
echo the second parameter is $2
echo the total value is $total
echo "通过basename来获取脚本的基本名字,不包含绝对路径"
if [ -n "$0" ]
then
name=$(basename "$0")
echo "this shell scripts is named $name"
else
echo sorry show your name first
fi
echo "howmany parameter has been input?"
echo $#
if [ $# -ne 2 ]
then
echo "请你输入两个参数 谢谢"
else
echo "我要输出最后一个参数 ${!#} 不能用\${\$#}的形式"
fi
echo "#\$*将所有参数当作一个整体 $*"
echo "#\$@将所有参数当作一个字符串中的独立单词 $@"
echo "通过shift来向前移动参数"
echo "\$1也可以用来处理选项"
echo "用双破折线--来区分选项和参数"
//格式化命令行参数
echo "set 的--选项将命令行参数变成set命令的命令行值"
while [ -n "$1" ]
do
case "$1" in
-a) echo "我是$1 选项" ;;
-b) param="$2"
echo " -b option, with parameter value $param"
shift;;
-c) echo "我是$1 选项" ;;
--) shift //向前移动一个参数,最前面的参数则丢弃
break;;
*) echo "$1 is not a option";;
esac
shift
done
count=1
for param in "$@"
do
echo "Parameter #$count=$param"
count=$[ $count+1 ]
shift
done
echo "测试用户输入"
read -s -p "please input your password " pass
echo
echo "you just input the value: $pass"
if read -t 5 -p "please input a value " b c
then
echo "you just input the value $b and $c"
else
echo "请在5秒内输入"
fi
echo -n "please input a value "
read -n1 answer
case $answer in
Y|y) echo OK;;
N|n) echo goodBye;;
*) echo; echo "输入的个什么鬼";;
esac
echo
//用户输入输出 与重定向
echo "0表示stdin 1表示stdout 2表示stderr 系统中有9个描述符从0-9"
ls -al test2 2>>test3
cat test3
echo
echo "输出重定向 &>将 stdout 和 stderr 重定向到文件test3中"
ls -al test test.sh test2 &>test3
cat test3
echo "临时重定向 >&2 需要在描述符前加& 下例从stdout 重定向到stderr"
echo "This is an error" >&2
echo "exec命令永久重定向"
exec 3>&1
exec 1>test3
exec 1>&3
echo "exec 0<testfile 这个命令可以从文件中输入"
echo "exec 3>&- 这个命令用来关闭设备描述符号"
echo "2>/dev/null 保存到这个路径下的所有信息都被丢弃"
//创建临时文件
echo "mktemp用于创建临时文件.后面的6个X系统自动替换以保证文件的唯一性"
echo "-t 选项强制在/tmp目录下创建文件,会返回全路径名"
echo "-d 选项用来创建临时目录"
mktemp testing.XXXXXX
echo "tee 命令同时将stdin的数据发送到stdou和文件中"
tee -a test3 <test3 #-a 追加 不覆盖
echo "nohup ./test.sh & 使得你退出终端会话后仍然能够运行 自动将输入重定向到nohup.out文件中"
echo "捕获sigint终止程序信号"
sleep 10
echo "捕获脚本的退出 在脚本退出时捕获exit信号"
trap "echo 捕获到了退出脚本的信号,所以我输出..." exit
//函数定义
echo "定义函数的两种方式"
function func1
{
echo "这是用第一种方式定义的函数"
}
function func2
{
echo "这是用第二种方式定义的函数"
echo "看看我能访问全局变量吗$value1"
local temp=$[ 18*20 ]
echo "我在函数内可以访问局部变量$temp"
return 300 //return 只能返回0-255之内包含的值,所以此处返回300后会进行求余
}
function func3
{
echo 300 //输出返回值
}
echo "看看我在函数外能够访问局部变量temp吗\$temp=$temp"
value1=188
func1
func2
echo "测试返回码"
echo "the return value is $?"
re=$(func3)
echo "the return value is $re"
echo
echo "数组变量的使用"
function func4
{
local array
array=($(echo "$@"))
echo "The new array value is ${array[*]}"
}
//学习数组的使用
myarray=(1 2 3 4 5 6)
echo The original array is ${myarray[*]}
func4 ${myarray[*]}
//库文件的加载
echo "定义函数库的方式(包含一类函数的脚本文件myfuncs)"
echo "1. 通过source在本shell中包含库脚本 . ./myfuncs注意中间有个空格"
echo "2. 在主目录.bashrc文件中定义函数 使得每个shell启动时都会加载他"
echo "3. 在.bashrc中通过source包含库脚本."
echo "4. 子shell可以使用父shell中的库脚本"
#下载shtool库文件
#ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz
#tar -zxvf shtool-2.0.8.tar.gz
# ./confifgure
# make
# make install
linux结构化shell编程学习
最新推荐文章于 2023-05-15 15:54:22 发布