红联Linux门户
Linux帮助

菜鸟学shell

发布时间:2013-11-05 14:56:11来源:红联作者:pkcsguang
1、变量赋值
a='123' 说明,= 号前后没有空格。有空格就报错
echo 打印变量内a容
用echo $a 表示, 组合其他文件 就用 echo " this is a ${a} book" 用${a}获取变量值。
注意变量的大小写,shell对大小写敏感。
echo 后面接东西要隔开一个空格。

如echo "" echo 与后面的 "" 有个空格


1104号,学习shell脚本,学习内容是各种循环。
if
for
while
until等







while read line ;do
echo $line;
done < /etc/hosts; 将文件内容显示输送的变量 line,然后显示
----------------------------------------------------------------------------
if结构式
if [ ... ];then
...........; 每句后都有;而 then 后面没有任务符号,
elif [ ... ] ;then
...........;
else
...........;
fi ;
----------------------------------------------------------------------------
for结构 for 变量 in 字符串|$变量m ,$变量m ,中含有多个数据,如$(list *.text) 等 或者$(seq 10) 之类的。

for 变量 in seq字符串 ;do

action ;

done

for结构赋值
for((赋值;条件;运算语句))

do

action

done;

实例(testfor2.sh):

#!/bin/sh

for((i=1;i<=10;i++));do
echo $i;
done;

可以看到 i-- 是否用双括号标准
而判断条件可以用单方括号,也可用双方括号。
----------------------------------------------------------------
while语句结构

while 条件语句;do

action

done;
while [[ $i -gt 5 ]];do 或者为 while [ $i -gt 5 ];do 单双没有关系
echo $i;
((i--));
done;
----------------------------------------------------------------------------------------
until结构

until 条件;do

action

done
------------------------------------------------------------------------------------------------
case结构

ase $arg in
pattern | sample)
action ;;
pattern1)
action ;;
*) #默认
action ;;
esac

pattern1 是正则表达式,可以用下面字符:

* 任意字串
? 任意字元
[abc] a, b, 或c三字元其中之一
[a-n] 从a到n的任一字元
| 多重选择
case $num in
1 | 2 | 3 | 4 | 5 ) 数字

case $1 in
start | begin) 字符,没有引号。
多个数据合作而条件选择时 用“| ” 进行“或”关系连接
----------------------------------------------------------------------------------------

select 变量name in seq变量;do

action

done

#!/bin/sh
WORD="a b c"
select i in $WORD d
select num in 1 2 3 4 5 6 7 8 9 10
select ch in "begin" "end" "exit"
select .. in .. 后面的内容,数字和字段有区别,数字不需要引号,字段就需要引号。
输出时,输入的是a b c 的序列号。
[root@node2 zhg1]# ./rselect
1) a
2) b
3) c
#? 3 输入3 显示第3个字符c
c
#? 1 输入1 显示第1个字符a
a
#? 2 输入2显示第2个字符b
b
#?

----------------------------------------------------------------
数组的表现形式: arr[@] 取数据内的数据${arr[@]} 用${ } 进行获取
A=( "F1" "f2" "f3" )
for i in ${A[@]}; do
echo $i ;
done

arr=("a" "b" "c")
echo "arr is (${arr[@]})"
echo "item in array:"
for i in ${arr[@]}
do
echo "$i"
done

1105 号练习记录
for练习
完成批量传输文件的处理
shell 脚本如下line:


srcfiles=$2
i=0
total=`wc -l $1` #初始化数据,注意用到``,也就是tab上面的~ 按钮, 效果与$() 完全一致

for line in $(cat $1)
do
(( i++)) #效果等同与let i++
# echo -e "\n\n"
echo $line;
cp $srcfiles $line #这才是核心命令,用cp命令完成复制。
#如果是用一个变量表示执行命令 如cmd ='cp'$srcfiles$line 这样是无法执行的,因为cp命令在执行的时候,命令、源文件、 目标文件 是有空格隔开的,如果是cmd ='cp' $srcfiles

$line 也不可以,虽然有空格,但是默认cmd就是cp两个字符,后的两个变量由于是空格隔开,所有就不认为是一个变量,唯一解决的办法就是用' '连接,表示空格 所有正确可执行的格式

就是cmd='cp '$srcfiles' '$line 这样在执行eval $cmd 解释为 cp 源文件 目标文件 可以完成复制任务了。
echo " cp $srcfiles $line "
echo '--------------- '$line' #'$i'/'$total' ---------------' 这个用于记录执行到$1的那一行路径了,主要是用于纠错处理。
done

脚本执行格式 ./line F/文件名(文件内容是各种路径) 需要被批量复制的文件
如 ./line /zhg/zhg1/qqq /zhg/zhg1/until :将/zhg/zhg1/until 复制到 /zhg/zhg1/qqq 中记录的各行路径中
文章评论

共有 2 条评论

  1. wxq4493 于 2013-11-06 15:08:52发表:

    。。。。

  2. PiOsnoae 于 2013-11-06 08:45:23发表:

    高人