1、
sh/bash 执行可以不要执行权限 x
./执行必须要执行权限
[weblogic@whtpltaxapp01t script]$ ls -lrt test.sh
-rw-rw-r-- 1 weblogic wlsoper 19 Mar 16 10:33 test.sh
[weblogic@whtpltaxapp01t script]$ sh test.sh
i am a baby
[weblogic@whtpltaxapp01t script]$ bash test.sh
i am a baby
[weblogic@whtpltaxapp01t script]$ ./test.sh
-bash: ./test.sh: Permission denied
[weblogic@whtpltaxapp01t script]$ chmod +x test.sh
[weblogic@whtpltaxapp01t script]$ ls -lrt test.sh
-rwxrwxr-x 1 weblogic wlsoper 19 Mar 16 10:33 test.sh
[weblogic@whtpltaxapp01t script]$ ./test.sh
i am a baby
source没有执行权限也可以执行,执行效果和.执行相同
最好用“.”或source先加载该脚本或配置文件
用sh执行脚本会导致当前Shell无法获得变量值
2、
中括号([])两端至少要有1个空格
对于常规变量的字符串定义变量值应加双引号,并且等号前后不能有空格
需要强引用的(指所见即所得的字符引用),则用单引号(’ ')
如果是命令的引用,则用反引号()
变量可分为两类:环境变量(全局变量)和普通变量(局部变量)。
环境变量也可称为全局变量,可以在创建它们的Shell及其派生出来的任意子进程Shell中使用,环境变量又可分为自定义环境变量和bash内置的环境变量。
环境变量一般是指用export内置命令导出的变量 export是临时,长久的话可在用户家目录下的.bash_profile或.bashrc(非用户登录模式特有,例如远程SSH)文件中,或者全局配置/etc/bashrc(非用户登录模式特有,例如远程SSH)或/etc/profile文件中定义。
普通变量也可称为局部变量,只能在创建它们的Shell函数或Shell脚本中使用。普通变量一般由开发者在开发脚本程序时创建。
[weblogic@whtpltaxapp01t script]$ baby="i am a babay"
[weblogic@whtpltaxapp01t script]$ echo $baby
i am a babay
$HOME:用户登录时进入的目录。
3、
$0 获取文件名
$n 获取当前执行脚本的第n个参数值 n大于9的话需要 ${10} 用中括号括起来
$#获取脚本传参的个数。
$@ $* 输出所有的传参,具体需要细看
测试:
[weblogic@whtpltaxapp01t script]$ vi p.sh
[weblogic@whtpltaxapp01t script]$ sh p.sh my
my
[weblogic@whtpltaxapp01t script]$ cat p.sh
echo $1
[weblogic@whtpltaxapp01t script]$ sh p.sh my name
my
[weblogic@whtpltaxapp01t script]$ sh p.sh "my name"
my name
传入两个参数:
[weblogic@whtpltaxapp01t script]$ cat p.sh
echo $1 $2
[weblogic@whtpltaxapp01t script]$ sh p.sh my name
my name
[weblogic@whtpltaxapp01t script]$ sh p.sh "my name" is
my name is
[weblogic@whtpltaxapp01t script]$ sh p.sh "my name" is ml
my name is
位置参数大于9之后,就会出现问题
位置参数数字大于9时,需要用大括号将数字括起来
Shell进程的特殊状态变量说明:
$? 获取上一个命令的执行状态 0–成功
测试:
[weblogic@whtpltaxapp01t script]$ pwd
/tpsys/applications/zhswgldomain/script
[weblogic@whtpltaxapp01t script]$ echo $?
0
[weblogic@whtpltaxapp01t script]$ ls /root/
ls: cannot open directory /root/: Permission denied
[weblogic@whtpltaxapp01t script]$ echo $?
2
[weblogic@whtpltaxapp01t script]$
$$就是获取当前执行的Shell脚本的进程号
read功能:从标准输入读取字符串等信息,传给Shell程序内部定义的变量。
echo的作用是逐行读取:
[weblogic@whtpltaxapp01t script]$ vi p.sh
[weblogic@whtpltaxapp01t script]$ cat p.sh
exec < /tpsys/applications/zhswgldomain/script/ml.sql #<===读取sql文件
while read line #<==利用read一行行读取
do
echo $line #<==打印输出
done
echo ok
[weblogic@whtpltaxapp01t script]$ sh p.sh
Well I wonder could it be
When I was dreaming about you baby
You were dreaming of me
tell me crazy
Call me blind
To still be suffering is stupid after all of this time
ok
[weblogic@whtpltaxapp01t script]$ ls
dm1028.log forcestop_1.sh index.html mis1021.log ml.sql p.sh startappserver1.sh stopappserver1.sh stpAdminServer.sh strAdminServer.sh test.sh TOM
[weblogic@whtpltaxapp01t script]$
长度查询:
[weblogic@whtpltaxapp01t script]$ imp="i am a baby"
[weblogic@whtpltaxapp01t script]$ echo $imp|wc -L
11
[weblogic@whtpltaxapp01t script]$ expr length "$imp"
11
[weblogic@whtpltaxapp01t script]$ echo "$imp"|awk '{print length($0)}'
11
[weblogic@whtpltaxapp01t script]$ echo ${#imp}
11
4、文字的截取
[weblogic@whtpltaxapp01t script]$ name=tomANdjack
[weblogic@whtpltaxapp01t script]$ echo $name
tomANdjack
[weblogic@whtpltaxapp01t script]$
从第2个字符之后开始截取:
[weblogic@whtpltaxapp01t script]$ echo ${name:2}
mANdjack
从第2个字符之后开始截取,截取2个字符:
[weblogic@whtpltaxapp01t script]$ echo ${name:2:2}
mA
#表示从开头删除匹配最短。
□##表示从开头删除匹配最长。
□%表示从结尾删除匹配最短。
□%%表示从结尾删除匹配最长。
□ac表示匹配的字符串,表示匹配所有,ac匹配开头为a、中间为任意多个字符、结尾为c的字符串。
□aC表示匹配的字符串,表示匹配所有,aC匹配开头为a、中间为任意多个字符、结尾为C的字符串。
5、文字的替换
□一个“/”表示替换匹配的第一个字符串。
□两个“/”表示替换匹配的所有字符串。
[weblogic@whtpltaxapp01t script]$ echo $name
Hi,hao are you boy? girl? girl?
[weblogic@whtpltaxapp01t script]$ echo ${name//girl/boy} //全部替换
Hi,hao are you boy? boy? boy?
[weblogic@whtpltaxapp01t script]$ echo $name
Hi,hao are you boy? girl? girl?
[weblogic@whtpltaxapp01t script]$ echo ${name/girl/boy} /只替换第一个
Hi,hao are you boy? boy? girl?
替换的案例:
(1)文件 取消 _test
[weblogic@whtpltaxapp01t ml]$ ls -lrt
total 20
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_test_5.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_test_1.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_test_2.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_test_3.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:25 ml_test_4.sql
(2)取一条进行试验
[weblogic@whtpltaxapp01t ml]$ str=ml_test_1.sql
[weblogic@whtpltaxapp01t ml]$ echo ${str//_test/}
ml_1.sql
[weblogic@whtpltaxapp01t ml]$ mv $str `echo ${str//_test/}` 注意操作命令一定是在反引号中间的(反引号是先执行里面的内容取代当前位置,再进行下一步操作)
[weblogic@whtpltaxapp01t ml]$ ls -lrt
total 20
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_test_5.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_1.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_test_2.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_test_3.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:25 ml_test_4.sql
(3)加上for循环操作
[weblogic@whtpltaxapp01t ml]$ for str in `ls ml_test*.sql`;do mv $str `echo ${str//_test/}`;done
[weblogic@whtpltaxapp01t ml]$ ls -lrt
total 20
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_5.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_1.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_2.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:24 ml_3.sql
-rw-rw-r-- 1 weblogic wlsoper 5 Mar 19 10:25 ml_4.sql
6、
${parameter:-word}功能实践
当name为空的话,可以自己赋值过去。
[weblogic@whtpltaxapp01t ml]$ echo $name 为空
[weblogic@whtpltaxapp01t ml]$ result=${name:-hahahaha}
[weblogic@whtpltaxapp01t ml]$ echo $result 将hahahaha赋值过去
hahahaha
[weblogic@whtpltaxapp01t ml]$ echo ${name} 但是name还是为空
[weblogic@whtpltaxapp01t ml]$
当name有值得时候,就打印result变量,返回test变量的内容。
[weblogic@whtpltaxapp01t ml]$ name="boy"
[weblogic@whtpltaxapp01t ml]$ echo $name
boy
[weblogic@whtpltaxapp01t ml]$ result=${name:-girl}
[weblogic@whtpltaxapp01t ml]$ echo $result
boy
[weblogic@whtpltaxapp01t ml]$ echo $name
boy
[weblogic@whtpltaxapp01t ml]$
${parameter:? word} 功能实践
可以用于设定由于变量未定义而报错的具体内容,如:“not defined”。
echo ${key:?not defined}
key 没有赋值的话,会报错 not defined
${parameter:+word}的作用是:如果parameter变量值为空或未赋值,则什么都不做,否则word字符串将替代变量的值。
7、数值运算
双小括号“(())”的作用是进行数值运算与数值比较,它的效率很高,用法灵活
[weblogic@whtpltaxapp01t ml]$ echo $a
2
[weblogic@whtpltaxapp01t ml]$ echo $((a+=1))
3
[weblogic@whtpltaxapp01t ml]$ echo $((a-=1))
2
[weblogic@whtpltaxapp01t ml]$ echo $a
2
[weblogic@whtpltaxapp01t ml]$
做比较判断:
[weblogic@whtpltaxapp01t ml]$ echo $((2<1))
0
[weblogic@whtpltaxapp01t ml]$ echo $((2>1))
1
8、let 赋值表达式
let ml+=1
let ml=ml+1
expr命令的基本用法示例
注意空格:
[weblogic@whtpltaxapp01t script]$ expr 1+2
1+2
[weblogic@whtpltaxapp01t script]$ expr 1 + 2
3
- 乘的话需要用\来转义
[weblogic@whtpltaxapp01t script]$ expr 1 \* 2
2
[weblogic@whtpltaxapp01t script]$ expr 1 * 2
expr: syntax error
[weblogic@whtpltaxapp01t script]$
注意总结:
1、运算符及用于计算的数字左右都至少有一个空格,否则会报错。
2、使用乘号时,必须用反斜线屏蔽其特定含义,因为Shell可能会误解星号的含义。
expr在Shell中可配合变量进行计算,但需要用反引号将计算表达式括起来。
[weblogic@whtpltaxapp01t script]$ name=5
[weblogic@whtpltaxapp01t script]$ name=`expr $name + 6`
[weblogic@whtpltaxapp01t script]$ echo $name
11
判断该数值是否为整数:
[weblogic@whtpltaxapp01t script]$ i=5
[weblogic@whtpltaxapp01t script]$ expr $i + 6 &>/dev/null
[weblogic@whtpltaxapp01t script]$ echo $?
0
[weblogic@whtpltaxapp01t script]$ i=lufei
[weblogic@whtpltaxapp01t script]$ expr $i + 6 &>/dev/null
[weblogic@whtpltaxapp01t script]$ echo $?
2
解释: &>/dev/null 不打印任何输出
是整数的话,与任何整数相加还是整数,echo $?是0;如果i不是整数,与整数相加肯定不是整数,这时echo $?不可能为0;