shell基础

1/shift<左移一位>
#!/bin/bash
while [ $# -gt 0 ]
do
 echo $*
 shift
 read
done

运行:#bash shift.sh 1 2 3 然后三次回车,查看效果

2/read
#!/bin/bash
read A B C
echo "\$A=$A"
echo "\$B=$B"
echo "\$C=$C"

运行:# bash read.sh
1 2 3 4  输入4个数查看效果
$A=1
$B=2
$C=3 4

3/bash -x参数可以显示shell运行过程

4/系统启动跑的第一个脚本 /etc/rc.d/rc.sysinit

5/# echo ${PATH}
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

# echo ${PATH#*:}  删除第一个
/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

# echo ${PATH##*:} 删除除最后一个
/root/bin

6/# A=/tmp/a/b/c
# echo ${A##*/}
c
# echo ${A%/*}
/tmp/a/b
# dirname $A
/tmp/a/b
   
7/sed流操作,操作文件某一部分(前身为ed),非交互式
sed [options] 'command' file(s)
    command 部分:[地址1,地址2][函数][参数]
    options部分:(命令行标记)

#sed '1d' file1 指删除文件file1第一行  <不会修改源文件>
#sed '1,2d' file1 指删除第一和二行
#sed '1ahello' file1 指第一行后面追加hello
#sed '1chello' file1 指第一行改为hello

#sed 's/localhost/hostlocal/g' sed.sh 替换
-n 不输出所有行
#sed -n 's/localhost/hostlocal/gp' sed.sh 只显示操作过的行,注意其中的-n 与 p

-e
-i 修改源文件***
#sed -i '1d' file1 删除第一行,此时再cat file1会发现第一行被删除了

# sed 's/localhost/hostlocal/g' sed.sh > sed.sh
# cat sed.sh
###此时文件会被清空,因为 > 追加先于sed中的替换执行,所以文件会丢失,慎重!!! 除非追加成不同文件<用不同文件名>

-f 指定脚本名称

脚本文件是一个sed的命令行清单
在每行的末尾不能有任何空格/制表符(tab)或其他
一行有多个命令,用";"分隔
不需要且不可用引号保护命令
#号开头为注释

正则表达式必须以“/”前后规范间隔
正则表达式中如出现特殊符号(^$.*/[]),需要以前导"\"号
# sed '/localhost/d' file1 删除有localhost字样的行
# sed '/a,/b/d' file1 删除包含有a到b的部分
# sed '/kevin/,+4d' file1 从kevin行开始再删4行,包括kevin共5行
# sed '/kevin/,~3d' file1 删除kevin行的三的倍数,共3行

# ifconfig lo | sed -n 's/.*addr:\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p'
127.0.0.1

# ifconfig lo | sed -n 's/.*addr://p' | sed -n 's/ .*//p'
127.0.0.1

8/金字塔
#!/bin/bash
for LINE in $(seq 1 $1)
do
    for SP in $(seq 1 $(($1-$LINE)))
    do
        echo -n " "
    done
 
    for K in $(seq 1 $(($LINE*2-1)))
    do
        echo -n "*"
    done
    echo
done

9/圣诞树
#!/bin/bash
SJX()
{
for LINE in $(seq 1 $1)
do
    for SP in $(seq 1 $(($2-$LINE)))
    do
        echo -n " "
    done
   
    for K in $(seq 1 $(($LINE*2-1)))
    do
        echo -n "*"
    done
    echo
done
}
for i in $(seq 1 $1)
do
    SJX $i $1
done

10/注释指定行
# sed '7,10s/^/#/' hosts

11/批量添加用户
# for GRP in $(cut -d" " -f2 user.list | sed 's/,/\n/g' | sort -u) ; do groupadd $GRP ; done
这是先从user.list表中提取组名,然后添加组

#!/bin/bash

USERLIST=/tmp/shell/user.list
PASSLIST=/tmp/shell/passwd.list

for i in $(cut -d" " -f2 $USERLIST | sed 's/,/\n/g' | sort -u ) ; do groupadd $i ; done

while read  U_NAME G_NAME H_DIR
do
        mkdir -p $(dirname $H_DIR)
        id $U_NAME &> /dev/null
        if [ $? -eq 0 ] ; then
                usermod -g $(echo $G_NAME | cut -d, -f1) -G $G_NAME -d $H_DIR $U_NAME
        else
                useradd -g $(echo $G_NAME | cut -d, -f1) -G $G_NAME -d $H_DIR $U_NAME
        fi
done < $USERLIST

while read U_NAME PASSWD
do
        if [ -z "$PASSWD" ]
        then
                echo "123456" | passwd $U_NAME --stdin
        else
                echo $PASSWD | passwd $U_NAME --stdin
        fi
done < $PASSLIST
passwd $U_NAME --stdin

12/awk

$0为取整行

# awk -F: '{ print $1 }' /etc/passwd 显示用户
# awk '{ FS = ":" } ; { print $1 }' /etc/passwd 显示用户

# awk -F: '/nologin$/{ print $1":"$7 }' /etc/passwd 显示不允许登录的用户
# awk -F: '! /nologin$/{ print $1":"$7 }' /etc/passwd 取反
# awk -F: '{ if ( $3 >=500 ) print $1";"$3}' /etc/passwd 显示ID>=500的用户
# awk -F: '{ if ( $3 >=500 && ( $3 != 65534 )) print $1":"$3}' /etc/passwd 显示ID>=500且不是65534的用户

# awk -F: '!/nologin$/{ if ( $3 >=500 && ( $3 != 65534 )) print $1":"$3}' /etc/passwd 显示ID>=500且不为65534和不是nologin的用户

# echo "1.1.1.1" | awk --posix '{ if ($0 ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/) print "this is ip"}' 匹配是否是一个IP

# awk '{ if (( NR >=6 ) && ( NR <=10 )) print $0}' /etc/passwd 显示6-10行

# cat awk.txt
1 2
4 3
5 6
# awk '{ print ($1 > $2)?$1:$2}' awk.txt 输出每行的较大数
2
4
6
# awk -v NUM=10 '{ print NUM ; NUM-- }' awk.txt 列数自减
10
9
8

你可能感兴趣的:(shell,基础,职场,休闲)