1:局部变量,全局变量
局部变量使用:
name=calvin
echo "This is my name $name"
默认局部变量:
$0 当前程序的名称
$n 当前程序的第n个参数,n=1,2,...9
$* 当前程序的所有参数(不包含程序本身)
$# 当前程序的参数个数(不包含程序本身)
$? 命令或程序执行完成后的状态,一般返回0表示执行成功
$UID 当前用户的ID
$PWD 当前用户的目录
外部传参方式
name=123
echo "This is my name $0"
echo "This is second $1"
wei@ubuntu:~/shell$ sh 01.sh 002
This is my name 01.sh
This is second 002
打出带颜色的字,[0m改为[1m下面的文字颜色均会变化
echo '\033[32m强调\033[0m'
wei@ubuntu:~/shell$ sh 01.sh
This is my name 01.sh
This is second
强调
(强调两字为绿色)
学到一个命令---文件中拷贝当前行:yyp
yy复制 dd删除 p黏贴
if判断
num=100
if [ $0 > 1 ]; then
echo "big the 1"
else
echo "less the 1"
fi
输出
wei@ubuntu:~/shell$ sh if.sh
big the 1
注意
1、[ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错4、判断是不支持浮点值的
5、如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意
6、在默认中,运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中
7、使用-z或者-n来检查长度的时候,没有定义的变量也为0
8、空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
9、? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)
if条件语句
-f 判断文件是否存在 if [ -f filname ]
-d 判断目录是否存在 if [ -d dir ]
-eq 等于 应用在整型比较
-ne 不等于 应用在整型比较
-lt 小于 应用在整型比较
-gt 大于 应用在整型比较
-le 小于或等于 应用在整型比较
-ge 大于或等于 应用在整型比较
-a 双方都成立(and) 逻辑表达式
-o 单方成立(or)逻辑表达式
-z 空字符串
测试脚本是否有语法问题
/bin/bash -n if1.sh
循环语句for
For 变量 in 字符串
do
语句1
done
#!/bin/bash
j=0
for ((k=1;k<=100;k++))
do
j=`expr $k + $j`
done
echo $j
tar压缩两个文件
for i in `find ./ -name "*.sh"|tail -2`
do
tar -cvf 2014all.tgz $i
done
解压缩
for i in `find ./ -maxdepth 1 -name "*.tgz"|tail -2`
do
tar xvf $i -C /home/wei/shell/test
done
while循环
i=1;
while [[ $i -lt 10 ]];do
echo $i;
((i++));
done;
read使用
read -p "Enter your name:" v1 v2
echo $v1
echo $v2
read读取整个文件
#!/bin/bash
while read line
do
echo $line
done </home/wei/shell/read.sh
awk读取第二行
#!/bin/bash
while read line
do
IP=`echo $line |awk '{print $2}'`
echo "\033[32mscp -r /tmp/test.txt root@$IP:/tmp \033[0m"
done <awk.txt
awk.txt
#ip list txt
1 192.168.1.11 /src1 /des1
2 192.168.1.12 /src2 /des2
3 192.168.1.13 /src3 /des3
4 192.168.1.14 /src4 /des4
5 192.168.1.15 /src5 /des5
6 192.168.1.16 /src6 /des6
until 循环
#!/bin/sh
a=10;
until [[ $a -lt 0 ]]; do
echo $a;
((a--));
done;
case选择语句
case $1 in
Apache )
echo "Wait instlal httpd server...."
tar jxvf httpd-2.2.27.tar.bz2 ;cd httpd-2.2.27
;;
Mysql )
echo "Wait instlal Mysql server..."
;;
PHP )
echo "Wait instlal PHP server..."
;;
* )
echo "Usage: {$0 Apache|Mysql|PHP|help}"
;;
esac
select语句
wei@ubuntu:~/shell$ select i in "centos" "redhat" "ubuntu" ;do echo "Select you use system:" $i;done
1) centos
2) redhat
3) ubuntu
#? 1
Select you use system: centos
select+case
select i in "Apache" "Mysql" "PHP"
do
case $i in
Apache )
echo "Wait instlal httpd server...."
tar jxvf httpd-2.2.27.tar.bz2 ;cd httpd-2.2.27
;;
Mysql )
echo "Wait instlal Mysql server..."
;;
PHP )
echo "Wait instlal PHP server..."
;;
* )
echo "Usage: {$0 Apache|Mysql|PHP|help}"
;;
esac
done
数组的使用
#!/bin/bash
soft=(
nginx-1.6.1.tar.gz
mysql-5.1.17.tar.gz
/etc/sysctl.conf
)
echo "This soft total ${#soft[@]} !"
echo "${soft[0]}"
#tar -xzf ${soft[0]};cd nginx-1.6.1;./configure;make;make install;