此链接通往 Bash Shell 编程学习的目录导航 ,从入门到放弃,感兴趣的可以去看看:
不要看见这个问题就感觉懵,就不知道是啥意思!换句话说就是: 如何在脚本内调用外部的参数!
答:使用位置变量 : $1、$2...$n
[ ] : bash 的内部命令!与 test 命令是等同的!
[[ ]] :是 bash 程序语言的关键字;并不是一个命令!
证明如下:
root@zhengzelin:~\# type [
[ is a shell builtin
root@zhengzelin:~\# type [[
[[ is a shell keyword
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
区别: [ ] 逻辑测试使用: -a(双方都为 true,结果才为 true)
-o(一方为 true,结果就为 true)
[[ ]] 逻辑测试使用: && (双方都为 true,结果才为 true)
|| (一个为 true,结果就为 true)
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
整数运算符:[ ] [[ ]] 都使用相同的:
-eq : 等于
-ne : 不等于
-lt : 小于
-le : 小于等于
-gt : 大于
-ge : 大于等于
注意: [ ] 中使用 < 或 > 的时候,必须使用转义字符: \< 或 \> ,因为 [ 是一个内部命令!
< : 标准输入
> : 标准重定向输出(覆盖原内容)
而 [[ ]] 却不需要!
共同点: 两个括号都可以用做 : 命令组
区别:
1、() 会开一个 子shell进程 来执行() 内的命令!而 { } 在当前shell进程执行其中命令!
2、() 内的命令中间使用";"隔开,末尾不需要";" 并且 () 与 cmd 之间不需要 空格隔开!
eg: (cmd1;cmd2) { cmd1;cmd2;} # 看开头的空格
{} 中 命令之间使用 ";" 隔开,结尾需要;
如果你的命令组中 有 exit 命令,你使用 exit 是想退出脚本,建议您使用 { },因为你使用 () 只会退出 () 开启的那个 子shell !
$PATH : 命令路径
$Shell: 当前 shell 类型
$SHLVL : 当前 shell 嵌套层次!(就是有几个shell进程)
$USER: 当前用户
$HOME : 当前用户的家目录
$? : 查看上一条命令是否执行成功(0为成功,非0为失败)
$HISTSIZE : 历史命令条数
$LANG : 当前系统语言
$PS1 : 登录系统时候的提示符!
赋值: 1、局部变量赋值: varname=值;
2、全局变量赋值: export varname=值 或 declare x varname=值
3、只读变量赋值: readonly varname=值 或 declare i varname=值
查看变量: set : 查看所有已定义的变量
export 或 env 或 declare -x 查看 所有环境变量!
readonly -p 查看只读变量!
删除变量: unset varname 删除变量!
只读变量无法删除,重启消失!
清空位置变量: set-- 清空 set-- 后面所有的位置变量
左移位置变量: shift
if 条件表达式;then
cmd
elif 条件表达式;then
cmd
else
cmd
fi
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
for varname in 取值列表
do
cmd(循环体)
done
for((表达式1;表达式2;表达式3;))
do
cmd(循环体)
done
嵌套:
for((表达式1;表达式2;表达式3;))
do
for((表达式1;表达式2;表达式3;))
do
cmd(循环体)
done
cmd(循环体)
done
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
while 表达式
do
cmd (循环体)
done
嵌套: 与上面的 for 一样!
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
until 表达式
do
cmd(循环体)
done
# until 是当 表达式为假时,开始执行循环体,当表达式为 true 时,停止执行。刚好与 while 相反!
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
case varname in
条件1)
cmd1...
;;
条件2)
cmd2...
;;
条件3)
cmd3...
;;
*) # *表示上面的条件没有符合的时候,执行这个;类似于 if 中的 else ;* 可以不写
cmd4..
;;
esac
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
select varname in 表达式
do
cmd..
done
方法1:
function functionname {
cmd
}
functionname # 调用函数
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
方法2:
functionname() {
cmd...
}
functionname # 调用函数
方法1:
root@zhengzelin:~# a=10;b=10
root@zhengzelin:~# let c=a+b
root@zhengzelin:~# echo $c
20
方法2:
root@zhengzelin:~# a=10;b=10
root@zhengzelin:~# c=$(expr $a + $b )
root@zhengzelin:~# echo $c
20
root@zhengzelin:~# a=10
root@zhengzelin:~# echo "$a"
10
root@zhengzelin:~# echo '$a'
$a
'' 相当于转义, "" 将变量变成它的值
-d : 判断 是否为目录(目录 是否存在)
-f : 判断 是否为 普通文件(普通文件 是否存在)
-b : 判断 是否为 块设备文件 (块设备文件 是否存在)
-c : 判断 是否为 字符设备文件 (字符设备文件 是否存在)
-l : 判断 是否为 软链接文件 (软链接文件 是否存在)
-z : 判断 是否为 空字符串
-n : 判断 是否为 非空字符串
! -z : 判断 是否为 非空字符串
输出 1 -100 中的所有数:
输出1 - 100:
使用 for :
for i in $(seq 1 100);do echo $i;done
for((i=1;i<=100;i++));do echo $i;done
使用 while :
a=1;while [ $a -le 100 ];do echo $a;let a++;done
a=1;while true;do echo $a;let a++;if [[ $a -gt 100 ]];then break;fi;done
a=1;while :;do echo $a;let a++;if [[ $a -gt 100 ]];then break;fi;done
# true 和 : 都是内部命令,执行都为true,你可以使用 type true 来查看命令类型,然后执行 true | echo $?
使用 until :
a=1;until [ $a -gt 100 ];do echo $a;let a++;done:
输出 1 - 100 中的 奇偶数:
for 列表格式:
奇数:for i in `seq 1 100`;do let a=$i%2;if [[ $a -eq 0 ]];then continue;fi;echo $i;done
偶数:for i in `seq 1 100`;do let a=$i%2;if [[ $a -eq 1 ]];then continue;fi;echo $i;done
# 解释: 当 i = 3 的时候,a=3%2, a=1,这为奇数,当 1 = 1 时(if条件判断句) 跳出此次循环(不输出奇数),所以就为 打印 偶数!
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
for 类C风格:
奇数: for((i=1;i<=100;i+=2));do echo $i;done
偶数: for((i=0;i<=100;i+=2));do echo $i;done
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
求和:
1-100 :
a=0;for i in $(seq 1 100);do let a=$a+$i;done;echo $a
a=0;for((i=1;i<=100;i++));do let a=$a+$i;done;echo $a
a=0;b=1;while [ $b -le 100 ];do let a=$a+$b;let b++;done;echo $a
a=0;b=1;until [ $b -gt 100 ];do let a=$a+$b;let b++;done;echo $a
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
奇数和:
b=0;for i in `seq 1 100`;do let a=$i%2;if [[ $a -eq 0 ]];then continue;fi;let b=$i+$b;done;echo $b
a=0;for((i=1;i<=100;i+=2));do let a=a+i;done;echo $a
a=0;for i in {1..100..2};do let a=$a+$i;done;echo $a
a=0;b=1;while [ $b -le 100 ];do let a=a+b;let b+=2;done;echo $a
——————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
偶数和:
b=0;for i in `seq 1 100`;do let a=$i%2;if [[ ! $a -eq 0 ]];then continue;fi;let b=$i+$b;done;echo $b
a=0;for((i=0;i<=100;i+=2));do let a=a+i;done;echo $a
a=0;for i in {0..100..2};do let a=$a+$i;done;echo $a
a=0;b=0;while [ $b -le 100 ];do let a=a+b;let b+=2;done;echo $a
root@zhengzelin:~# for((i=1;i<=5;i++));do for((a=1;a<=$i;a++));do echo -n "*";done;echo;done
*
**
***
****
*****
root@zhengzelin:~# for((i=5;i>=1;i--));do for((a=$i;a>=1;a--));do echo -n "*";done;echo;done
*****
****
***
**
*
for((i=1;i<=$1;i++))
do
let a1=$1-$i
for((a=1;a<=$a1;a++))
do
echo -n " "
done
let b1=2*$i-1
for((b=1;b<=$b1;b++))
do
echo -n "*"
done
echo
done
root@zhengzelin:~# ./while1.sh 5
*
***
*****
*******
*********
root@zhengzelin:~# ./while1.sh 6
*
***
*****
*******
*********
***********
root@zhengzelin:~# for((i=1;i<=9;i++));do for((a=1;a<=$i;a++));do let c=$a*$i;echo -n "$a*$i=$c ";done;echo;done
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81