linux结构化shell编程学习

#!/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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值