Linux之shell学习笔记01

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的字符串。
□a
C表示匹配的字符串,表示匹配所有,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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虫子小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值