$HOME、$PWD、$SHELL、$USER等
查看系统变量的值
[root@localhost ~]$ echo $HOME
/root
[root@localhost ~]$
[root@localhost ~]$ A=5
[root@localhost ~]$ echo $A
5
[root@localhost ~]$ A=8
[root@localhost ~]$ echo $A
8
[root@localhost ~]$ unset A
[root@localhost ~]$ echo $A
[root@localhost ~]$
[root@localhost ~]$ readonly B=2
[root@localhost ~]$ echo $B
2
[root@localhost ~]$ B=9
-bash: B: readonly variable
[atguigu@hadoop102 ~]$ C=1+2
[atguigu@hadoop102 ~]$ echo $C
1+2
[atguigu@hadoop102 ~]$ D=I love banzhang
-bash: world: command not found
[atguigu@hadoop102 ~]$ D="I love banzhang"
[atguigu@hadoop102 ~]$ echo $A
I love banzhang
[root@0725pc shells]$ echo $A
hello
[root@0725pc shells]$ B="hello $A"
[root@0725pc shells]$ echo $B
hello hello
[root@0725pc shells]$ C='hello $A'
[root@0725pc shells]$ echo $C
hello $A
ll
等同于 A=$(ll)[root@0725pc shells]$ D=`ll`
[root@0725pc shells]$ echo $D
总用量 4 -rwxr--r--. 1 root root 23 10月 8 21:36 test1.sh
[root@0725pc shells]$ E=$(ll)
[root@0725pc shells]$ echo $E
总用量 4 -rwxr--r--. 1 root root 23 10月 8 21:36 test1.sh
[root@localhost ~]$ vim helloworld.sh
在helloworld.sh文件中增加echo $B
#!/bin/bash
echo "helloworld"
echo $B
[root@localhost ~]$ ./helloworld.sh
Helloworld
发现并没有打印输出变量B的值。
[root@localhost ~]$ export B
[root@localhost ~]$ ./helloworld.sh
helloworld
每次修改 /etc/profile时,我们会执行source /etc/profile,source的作用就是执行文件中所有的export命令!
[atguigu@hadoop101 datas]$ touch parameter.sh
[atguigu@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
[atguigu@hadoop101 datas]$ chmod 777 parameter.sh
[atguigu@hadoop101 datas]$ ./parameter.sh cls xz
./parameter.sh cls xz
[atguigu@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
[atguigu@hadoop101 datas]$ chmod 777 parameter.sh
[atguigu@hadoop101 datas]$ ./parameter.sh cls xz
parameter.sh cls xz
2
[atguigu@hadoop101 datas]$ vim parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
echo $*
echo $@
[atguigu@hadoop101 datas]$ bash parameter.sh 1 2 3
parameter.sh 1 2
3
1 2 3
1 2 3
[atguigu@hadoop101 datas]$ ./helloworld.sh
hello world
[atguigu@hadoop101 datas]$ echo $?
0
[atguigu@hadoop101 datas]$ expr 2 + 3
5
[atguigu@hadoop101 datas]$ expr 3 - 2
1
[atguigu@hadoop101 datas]$ expr `expr 2 + 3` \* 4
20
(b)采用$[运算式]方式
[atguigu@hadoop101 datas]$ S=$[(2+3)*4]
[atguigu@hadoop101 datas]$ echo $S
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。
符号 | 作用 |
---|---|
= | 字符串比较(等号两侧要加空格) |
-lt | 小于(less than) |
-le | 小于等于(less equal) |
-eq | 等于(equal) |
-gt | 大于(greater than) |
-ge | 大于等于(greater equal) |
-ne | 不等于(Not equal) |
符号 | 作用 |
---|---|
-r | 有读的权限(read) |
-w | 有写的权限(write) |
-x | 有执行的权限(execute) |
符号 | 作用 |
---|---|
-f | 文件存在并且是一个常规的文件(file) |
-e | 文件存在(existence) |
-d | 文件存在并是一个目录(directory) |
-s | 文件存在且不为空 |
-L | 文件存在且是一个链接(link) |
[atguigu@hadoop101 datas]$ [ 23 -ge 22 ]
[atguigu@hadoop101 datas]$ echo $?
0
[atguigu@hadoop101 datas]$ [ -w helloworld.sh ]
[atguigu@hadoop101 datas]$ echo $?
0
[atguigu@hadoop101 datas]$ [ -e /home/atguigu/cls.txt ]
[atguigu@hadoop101 datas]$ echo $?
1
[atguigu@hadoop101 ~]$ [ condition ] && echo OK || echo notok
OK
[atguigu@hadoop101 datas]$ [ condition ] && [ ] || echo notok
notok
if [ 条件判断式 ]
then
程序
elif 条件判断式
then 程序..
else 程序..
fi
或
if [ 条件判断式 ] ; then
程序..
elif [条件判断式] ; then
程序..
else 程序
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
[root@0725pc shells]$ cat test3.sh
#! /bin/bash
if [ $1 -eq 1 ]
then
echo "你输入的是1啊!"
elif [ $1 -eq 2 ]
then
echo "你输入的是2啊!"
elif [ $1 -eq 3 ]
then
echo "你输入的是3啊!"
else echo "你输入的不是1,2,3啊!"
fi
[root@0725pc shells]$ bash test3.sh 3
你输入的是3啊!
[root@0725pc shells]$ bash test3.sh 2
你输入的是2啊!
[root@0725pc shells]$ bash test3.sh 1
你输入的是1啊!
[root@0725pc shells]$ bash test3.sh 4
你输入的不是1,2,3啊!
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
1) case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2) 双分号“;;”表示命令序列结束,相当于java中的break。
3) 最后的“*)”表示默认模式,相当于java中的default。
[atguigu@hadoop101 datas]$ touch case.sh
[atguigu@hadoop101 datas]$ vim case.sh
!/bin/bash
case $1 in
"1")
echo "banzhang"
;;
"2")
echo "cls"
;;
*)
echo "renyao"
;;
esac
[atguigu@hadoop101 datas]$ chmod 777 case.sh
[atguigu@hadoop101 datas]$ ./case.sh 1
1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
或
for (( 初始值;循环控制条件;变量变化 )); do 程序; done
案例实操:从1加到100
[atguigu@hadoop101 datas]$ touch for1.sh
[atguigu@hadoop101 datas]$ vim for1.sh
#!/bin/bash
s=0
for((i=0;i<=100;i++))
do
s=$[$s+$i]
done
echo $s
[atguigu@hadoop101 datas]$ chmod 777 for1.sh
[atguigu@hadoop101 datas]$ ./for1.sh
“5050”
[root@0725pc shells]$ tail -n 4 test1.sh
SUM2=0
for((i=0;i<=10;i++));do SUM2=$(($SUM2+$i)); done
echo "从1加到100的值是:$SUM2"
[root@0725pc shells]$ ./test1.sh
从1加到100的值是:55
for 变量 in 值1 值2 值3…
do
程序
done
或
for 变量 in 1 2 3; do 程序; done
或
for 变量 in {1..3}; do 程序; done
案例实操:打印所有输入参数
[atguigu@hadoop101 datas]$ touch for2.sh
[atguigu@hadoop101 datas]$ vim for2.sh
#!/bin/bash
#打印数字
for i in $*
do
echo "ban zhang love $i "
done
[atguigu@hadoop101 datas]$ chmod 777 for2.sh
[atguigu@hadoop101 datas]$ bash for2.sh cls xz bd
ban zhang love cls
ban zhang love xz
ban zhang love bd
多种写法
[root@0725pc shells]$ cat test2.sh
#! /bin/bash
for i in 1 2 3
do
echo $i
done
echo "--------------------"
for i in 1 2 3 ;do echo $i;done
echo "--------------------"
for i in {1..3};do echo $i;done
[root@0725pc shells]$ ./test2.sh
1
2
3
--------------------
1
2
3
--------------------
1
2
3
比较 ∗ 和 *和 ∗和@区别
[atguigu@hadoop101 datas]$ touch for.sh
[atguigu@hadoop101 datas]$ vim for.sh
#!/bin/bash
for i in $*
do
echo "ban zhang love $i "
done
for j in $@
do
echo "ban zhang love $j"
done
[atguigu@hadoop101 datas]$ bash for.sh cls xz bd
ban zhang love cls
ban zhang love xz
ban zhang love bd
ban zhang love cls
ban zhang love xz
ban zhang love bd
[atguigu@hadoop101 datas]$ vim for.sh
#!/bin/bash
for i in "$*"
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "ban zhang love $i"
done
for j in "$@"
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "ban zhang love $j"
done
[atguigu@hadoop101 datas]$ chmod 777 for.sh
[atguigu@hadoop101 datas]$ bash for.sh cls xz bd
ban zhang love cls xz bd
ban zhang love cls
ban zhang love xz
ban zhang love bd
while [ 条件判断式 ]
do
程序
done
或
while((表达式))
do
程序
done
[atguigu@hadoop101 datas]$ touch while.sh
[atguigu@hadoop101 datas]$ vim while.sh
#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
s=$[$s+$i]
i=$[$i+1]
done
echo $s
[atguigu@hadoop101 datas]$ chmod 777 while.sh
[atguigu@hadoop101 datas]$ ./while.sh
5050
[root@0725pc shells]$ bash test3.sh
11
[root@0725pc shells]$ cat test3.sh
#! /bin/bash
NUM=0
while((NUM<=10));do let NUM++; done
echo $NUM
基本语法
basename [string / pathname] [suffix]
选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’)字符,然后将字符串显示出来。
案例实操:截取该/home/atguigu/banzhang.txt路径的文件名称
[atguigu@hadoop101 datas]$ basename /home/atguigu/banzhang.txt
banzhang.txt
[atguigu@hadoop101 datas]$ basename /home/atguigu/banzhang.txt .txt
banzhang
基本语法
dirname 文件绝对路径
功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)
案例实操:获取banzhang.txt文件的路径
[atguigu@hadoop101 ~]$ dirname /home/atguigu/banzhang.txt
/home/atguigu
function funname[()]
{
Action;
[return int;]
}
funname
经验技巧
案例实操:计算两个输入参数的和
[atguigu@hadoop101 datas]$ touch fun.sh
[atguigu@hadoop101 datas]$ vim fun.sh
#!/bin/bash
function sum()
{
s=0
s=$[ $1 + $2 ]
echo "$s"
}
read -p "Please input the number1: " n1;
read -p "Please input the number2: " n2;
sum $n1 $n2;
[atguigu@hadoop101 datas]$ chmod 777 fun.sh
[atguigu@hadoop101 datas]$ ./fun.sh
Please input the number1: 2
Please input the number2: 5
7