您的位置:首页 > 运维架构 > Shell

shell基础

2016-09-22 19:35 120 查看
#
for skill in Ada Coffe ACtion Java;do
echo "I am good at ${skill}Script"
done

#定义变量时,=左右不能有空格。定义变量时没有$,使用时必须有$
aa="http://www.w3school.cc"

#readonly 表示只读属性。
readonly aa
#aa="Http://www.baidu.com"
# unset 变量删除
unset aa
echo $aa
# 单引号,不支持变量和转义。双引号支持变量和转义
k="Keytty"
str1='111111111${k}'
str2="111111111${k}"
echo $str1
echo $str2

#拼接字符
your_name=$k
greeting1="hello,"$your_name"!"
greeting2="hello,"${your_name}"!"
echo $greeting1
echo $greeting2

#获取字符串长度
string="abc"
echo ${#string}
#提取字符串
string="runoob is a site"
echo ${string:1:4}
#查找子字符串。查找is或s的位置。输出8

echo `expr index "$string" is`
#定义数组 array_name=(value0 value1 value2 value3).用空格分开
array_name=(value0 value1 value2 value3)
echo ${array_name[1]}
#使用@ 获取数组中所有元素
echo ${array_name[@]}
#获取数组长度
echo ${#array_name[@]}
echo ${#array_name[*]}
#获取单个元素长度
echo ${#array_name[1]}

#获取参数为$0,$1,$2,,,,其中$0 表示执行的文件名.:!sh a.sh China Hangzhou
echo "Shell 传递参数实例:"
echo "执行文件名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "传递脚本的参数个数:"$#
echo "传递脚本的参数:"$* #$*把参数看成"China Hangzhou",$@把参数看成"China""Hangzhou"
echo "脚本运行当前的进程号:"$$
echo "后台运行的最后一个进程号:"$!
echo "传递脚本的参数:"$@
echo "显示shell使用的当前选项"$-  #打印  hB 什么意思?
echo "显示最后命令的退出状态:"$? #0 没有错误,其他任何值表示有错误
# 演示 $*  和  $@
echo "-------------\$*-----------" # 这里一定要加转义,否则就输出参数了
for i in "$*";do
echo $i
done
echo "-------------\$@-----------"
for i in "$@";do
echo $i
done

#只支持一维数组,初始化不需要定义数组大小,由0开始
my_array=(A B "C" D)
#my_array[4]="ChinaHangZhou"
echo ${my_array[2]}
echo ${my_array[3]}

#chmod +x a.sh

#expr表达式计算工具,完成表达式求值操作
val=`expr 2 + 2` #表达式和运算符之间要有空格,完整的表达式需要用``包括起来
echo "两数之和为:"$val
#条件表达式必须放在方括号之间,如[ $a==$b ],括号与变量之间有空格
a=10
b=20
val=`expr $a + $b`
echo '$a + $b = '$val
val=`expr $a = $b`
echo '$a - $b = '$val
val=`expr $a \* $b` #注意乘号面前要加转义字符\
echo '$a * $b = '$val
val=`expr $a / $b`
echo '$a / $b = '$val
val=`expr $a % $b`
echo '$a % $b = '$val
if [ $a == $b ] #注意这里要写成$a == $b
then
echo '$a==$b'
fi
if [ $a != $b ]
then
echo '$a!=$b'
fi
#Mac中expr表达式为$((表达式))乘号不需要转义符号\

#关系运算符
#只支持数字,不支持字符串,除非字符串是数字
# -eq :check if equal, [ $a -eq $b ]
# -ne :check if no equal, [ $a -ne $b ]
# -gt :check if greater than, [ $a -gt $b ]
# -lt :check if less  than, [ $a -lt $b ]
# -ge :check if greater than or equal , [ $a -ge $b ]
# -le :check if less than or equal , [ $a -le $b ]

# 布尔运算
# ! 非运算符 [ !false ]
# -o 或运算符  [ $a -lt 20 -o $b -gt 100 ]
# -a 与运算符  [ $a -lt 20 -a $b -gt 100 ]
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b, not equal!"
else
echo "$a == $b, equal!"
fi
if [ $a -lt 100 -a $b -gt 25 ]
then
echo "$a -lt 100 -a $b -gt 25: return true"
else
echo "$a -lt 100 -a $b -gt 25: return false"
fi
if [ $a -lt 100 -o $b -gt 25 ]
then
echo "$a -lt 100 -o $b -gt 25:return true"
else
echo "$a -lt 100 -o $b -gt 25:return false"
fi
#逻辑运算符
# && 逻辑AND [[ $a -lt 100 && $b -gt 100 ]] return false
# || 逻辑OR  [[ $a -lt 100 || $b -gt 100 ]] return true
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "[[ $a -lt 100 && $b -gt 100 ]]:return true"
else
echo "[[ $a -lt 100 && $b -gt 100 ]]:return false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "[[ $a -lt 100 || $b -gt 100 ]]:return true"
else
echo "[[ $a -lt 100 || $b -gt 100 ]]:return false"
fi

# 字符串运算符
# a="abc"
# b="efg"
# = 检查2个字符串是否相等,[ $a = $b ] false
# != 检查2个字符串是否不相等, [ $a != $b ] true
# -z 检查字符串长度是否为0,为0返回true,[ -z $a ] false
# -n 检查字符串长度是否为0,不是0,返回true,[ -n $a ] true
# str 检查字符串是否为空,不为空返回true  [ $a ]true
a="abc"
b="efg"
if [ $a = $b ]
then
echo "$a = $b : return true"
else
echo "$a = $b : return falsee"
fi
if [ -z $a ]
then
echo "-z $a : 字符串长度为0,返回true"
else
echo "-z $a : 字符串长度不为0,返回false"
fi
if [ $a ]
then
echo "$a :字符串不为空"
else
echo "$a :字符串为空"
fi

#文件测试运算符
# -b file :检查文件是否块设备文件,是则返回true [ -b $file ]
# -c file :检查文件是否字符设备文件,是则返回true
# -d file :检查文件是不是目录,是则返回true
# -f file :检查文件是不是普通文件,是则返回true
# -g file :检查文件是不是设置了SGID位,是则返回true
# -k file :检查文件是否设置了粘着位(Sticky Bit),是则返回true
# -p file :检查文件是不是管道,是则返回true
# -u file :检查文件是不是设置了SUID位,是则返回true
# -r file :检查文件是不是可读,是则返回true
# -w file :检查文件是不是可写,是则返回true
# -x file :检查文件是不是可执行,是则返回true
# -s file :检查文件是不是为空(文件大小是不是大于0),不空则返回true
# -e file :检查文件(包括目录)是不是存在,是则返回true
file=$0
if [ -r $file ]
then
echo "$file :can read"
else
echo "$file :cannot read"
fi
if [ -w $file ]
then
echo "$file:can write"
else
echo "$file :cannot write"
fi
if [ -s $file ]
then
echo "$file: length>0"
else
echo "$file:length=0"
fi
if [ -e $file ]
then
echo "$file:exists"
else
echo "$file:not exists"
fi

#echo 命令
#打印"需要加转义字符
echo "打印字符\"是需要转义字符\\的"
#read 命令从标准输入中读取一行
echo "Please enter input:"
#read name
echo "You Enter \"$name\""

# -e 开启转义
echo -e  "Ok,换行\n换行结束"
echo -e "Ok,不换行\c"

#显示日期
echo `date`

# for 循环
for var in item1 item2 itemN
do
echo $val
done
for loop in 1 2 3 4 5
do
echo "The value is:$loop"
done
for str in "This is str1" "This is str2"
do
echo $str
done
# while
int=1
while (( $int <= 5 )) #注意空格,注意这里是2个(())
do
echo "This is while,int=$int"
let "int++"
done
#echo "Enter <Ctrl-D> to quit."
#echo -n 'Enter your favorate film:'
#while read film
#do
#	echo "Yes,$film is a good film!"
#	echo "Enter <Ctrl-D> to quit."
#	echo -n 'Enter your favorate film:'
#done

# until 循环 , 一直执行,直到条件为真时停止
myvar=1
until [ $myvar -gt 10 ]
do
echo "This is until,myvar=${myvar}"
myvar=$(( $myvar + 1 ))
done

myvar=1
while [ $myvar -gt 10 ] # 一直执行,直到条件为假时停止
do
echo "This is while,myvar=${myvar}"
myvar=$(( $myvar + = ))
done

# case
for item in item1 item2 item3
do
case $item in
item1)  #注意要使用 item1)括号
echo "This is case item1:$item"
;; #注意本条case命令序列完成后已;;结束
item2)
echo "This is case item2:$item"
;;
*) # *)表示默认命令序列
echo "This is default command"
;;
esac # esac 是case模块的结束标志,是case反着写 esac
done

# break  跳出循环
# continue 继续循环

# shell 函数
function doFunc()
{
echo "This is my first Func!"
}

doFunc2(){ #参数是$1,$1,...$n ,当天n>10时,需要使用${10}来获取参数
echo "The length of doFunc2 params is: "$#
for param in $@
do
echo $param
done
}
echo "------------before call doFunc------------"
doFunc #直接也函数名
echo "------------after call doFunc------------"
echo "------------before call doFunc2------------"
doFunc2 param1 param2 param3  # 传参直接跟在后面
echo "------------after call doFunc2------------"

# 输入输出重定向
# >file
# <file
# >> file 追加
# n >& m 将输出文件m和n合并
# n <& m 将输入文件m和n合并
# <<tag将开始标记tag和结束标记tag之间的内容作为输入

# 标准输入文件:stdin的文件描述符为0
# 标准输出文件:stdout的文件描述符为1
# 标准错误文件:stderr的文件描述符为2

# stderr重定向到文件: command 2 >> file 追加的方式,>是覆盖
# 将stdout和stderr合并到一个文件输出:command >> file 2>&1

# Here Document 是Shell中一种特殊的重定向方式,用来将输入重定向到一个交互式Shell脚本或程序
# command << delimiter
#	document
# delimiter
# 作用是:将2个delimiter之间的内容作为输入传递给command。
# delimiter一定要定格写

wc -l << EOF
Welcome to
W3School !
www.w3school.cc
EOF
wc -l < $0 >> file 2>&1 # 将标准输出和错误输出重定向到file文件中
wc -l < $0 >> file2 2>&2
# 如果希望执行某个命令,但又不希望屏幕上显示输出结果,可以重定向到/dev/null
# command > /dev/null
# 写入到/dev/null的内容都会被丢弃。如果尝试从/dev/null中读取内容会什么也读不到。将输出重定向到/dev/null会起到“禁止输出”的效效果
echo "演示:wc -l < $0 > /dev/null 2>&1 "
wc -l < $0 > /dev/null 2>&1  #禁止输出

#引用外部脚本.2种方式:
. ./b.sh
echo "b.sh的变量为:$b_var"

source ./c.sh
echo "c.sh的变量为:$c_var"

#参考地址 http://www.runoob.com/linux/linux-shell.html[/code] 
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell