关于脚本,script的粗略比如

shell-script的简单举例,shell-script举例

#!/bin/bash
#defind the path
PATH=/usr/local
export PATH
read -p "please input your first name:" firstname
reap -p "please input your last name:" lastname
echo -e "\nyour name is: $firstname $lastname"

#use date create file
read -p "please input your filename:" fileuser
filename=${fileuser:-"filename"}
#use date get the filename
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}
touch "$file1"
touch "$file2"
touch "$file3"

#条件判断式
read -p "please input (Y/N): " yn
if [ "$yn"=="Y" ] || [ "$yn"=="y" ] ; then
    echo "OK continue"
    exit 0
fi
if [ "$yn"=="N" ] || [ "$yn"=="n" ] ; then
    echo "OK continue"
    exit 0
fi
#第二种情况
if [条件判断式]; then 
   内容
else
    内容
fi    
#三
if [条件判断式]; then 
   内容
elif [条件判断式]; then
    内容
else
    内容
fi

#利用case...esac判断
case $变量名称 in
   "第一个变量内容")
   程序段
   ;;
   "第二个变量内容")
   程序段
   ;;
   *)
   程序段(不包含第一和第二个变量内容中的)
   exit 1 
   ;;
esac

#举例
case $1 in
   "one")
   echo "This is one"
   ;;
   "two")
   echo "this is two"
   ;;
   "three")
   echo "This is three"
   ;;
   *)
   echo "no number"
   ;;
esac

#利用function功能(shell script执行方式是 由上而下,由左至右,所以function函数一定要写在程序的最前边)

function printit(){
   echo -n "Your choice is "
}

 

#!/bin/
bash#defind the pathPATH =/usr/ localexport PATHread -p ” please input
your first name: ” firstnamereap -p ” please input y…

(一)首先来看shell脚本的执行方式,shell脚本的后缀名都是sh文件。

#! /bin/bash
read -p “please input a number:” a
case “$a” in
1)
echo “The num is 1”
;;
2)
echo “The num is 2”
;;
[3-9])
echo “The num is $a”
;;
*)
必发88官网,echo “please input[0-9] int”
exit
;;
esac

1 sh
test.sh

2 source
test.sh

这两种方式有什么区别呢。test.sh
里的脚本很简单,
从键盘输入名字后赋值个name变量

read -p “Please input your
name:” name

执行如下

root@zhf-linux:/home/zhf/zhf/shell_prj# sh
test1.sh

please input your
name:zhf

root@zhf-linux:/home/zhf/zhf/shell_prj# echo
$name

echo
$name是空值。原因前面介绍过。bash在执行脚本的时候,是另起一个子进程。当子进程完成后,子进程内的变量不会传入父进程中去

但是用source执行脚本就不一样了。
原因在于source对script的执行方式是在父进程中进行的。

root@zhf-linux:/home/zhf/zhf/shell_prj# source
test1.sh

please input your
name:zhf

root@zhf-linux:/home/zhf/zhf/shell_prj# echo
$name

zhf

在脚本中,避免不了要进行各种条件判断。条件判断有test
和[]两种方式

test方式:

read -p “please input your
name:” name

test -z $name && echo “you
must input your name”

-z
是判断字符串是否为0也就空字符串,如果是,则提示输入名字

root@zhf-linux:/home/zhf/zhf/shell_prj# sh
test1.sh

please input your
name:

you must input your
name

test有很多判断参数,具体可以用man
test的进行查看

[]方式:

read -p “please input your
name:” name

[ -z “$name” ] && echo
“please input your name”

使用[]有几点需要注意:

1
在中括号内的每个组件都需要有空格键来分隔

2
在中括号内的变量都需要用双引号起来

关于第二点,如果不用双引号括起来,会引起如下问题:

root@zhf-linux:/home/zhf/zhf/shell_prj# name=”cq
zhf”

root@zhf-linux:/home/zhf/zhf/shell_prj# [ $name == “cq
zhf” ]

bash: [: too many
arguments

原因在于$name=cq zhf,
如果没有双括号,那么上面的不等式就等于 cq zhf == “cq
zhf”。系统会认为是2个变量,因此提示too many
arguments.

 

(二)script的变量。

在执行脚本的时候,会传入某些参数。那么在脚本里面如何监控这些参数呢

$#代表参数的个数

$@得到全部的参数

$1,$2…..代表的是各个参数。其中$0是指的脚本名称。

root@zhf-linux:/home/zhf/zhf/shell_prj# sh test1.sh one
two three

The scritp name is
test1.sh

The total number of
parameter is 3

The first parameter is
one

如果输入的变量太多,单从顺序上去记忆也比较麻烦,有一种参数偏移的方法可以省事一些。shift命令。这个命令的作用好比是一个FIFO的栈。

root@zhf-linux:/home/zhf/zhf/shell_prj# sh test1.sh one
two three

The scritp name is
test1.sh

The total number of
parameter is 3

The first parameter is
one

The first parameter is
two

其他流程控制语句,例如if, when,
for…do…done等都和其他语言用法类似。