Shell学习笔记

来源:互联网 发布:淘宝日系男装 编辑:程序博客网 时间:2024/06/07 01:08
命令格式:command [-potions] param1 param2 ...


echo $LANG    当前语言(zh_CN.UTF-8,en_US,zh_CN.GB18030)环境

set fileformat=unix   

 win编写sh上传到linux文件类型为dos。运行时会出现: /bin/bash^M: badinterpreter: 没有那个文件或目录。在vi中 :set fileformat可以查看文件的操作系统类型。需要修改成:setfileformat=unix。

alias hdfs='hadoop fs'  修改命令别名。
read myvar  交互式对变量赋值
basename $0  去掉位置参数的路径 ./run.sh --> run.sh
dirname $0 
$0 命令本身的名称,$# 参数的数目,$*和$@相同为参数本身的列表,但"$*" 和 "$@"(加引号)并不同,"$*"将所有的参数解释成一个字符串,而"$@"是一个参数数组
后台进程PID被赋予$!,$$是shell自身的进程ID,$?表示上一次运行命令的返回码 0表示运行成功。
unset myvar 删除变量
${#myvar}  变量字符数目
echo ${!myvar}  变量myvar值的变量值
${myvar:-defalutVal},${myvar:=defalutVal}(对往后代码的此变量有效)   赋予myvar默认值
echo $myvar | tr '[a-z]' '[A-Z]'  把myvar的小写转换成大写
${myvar:3},${myvar:3:2},${myvar: -3}(从尾开始),${myvar#word}(裁剪),${myvar##word}(贪婪),${myvar%word}(从结尾开始),${myvar%%word}   字符串剪切

sed -i s/old/new/g myfile ,echo "$myvar" | sed s/old/new/g (sed s/old/new/2 替换第二个old) 替换字符

sed配合find批量替换:find . -type f -name "*.xml" | xargs sed -i s/old/new/g 替换查找到文件的字符

echo ${myvar/old/new}(替换第一个), ${myvar//old/new},${myvar/#old/new}(开头是old),${myvar/%old/new}(结尾是old)  变量替换
seq [选项]... 首数 增量 尾数  产生从某个数到另外一个数之间的所有整数
set -f (或者 set -o noglob) 关闭文件名扩展名,+f 开启
man test,shopt 命令
IFS 是内部的域分隔符 默认值为:空白(包括:空格,tab, 和新行)
let a=$a+1,a=`expr $a + 1` a=$((1 + 1)) 计算
echo "test" | tee myfile 输出同时导向stdout与文件。
exec cmd 当前运行的进程替换为另一个
ls /etc/hosts > out 2> err 
command > file 2>&1 这条命令就将stdout直接送向file, stderr 继承了FD1管道后,再被送往file,此时,file 只被打开了一次,也只使用了一个管道FD1,它包括了stdout和stderr的内容.
读取顺序:su -  会顺序读取/etc/profile,~/.bashrc,~/.bash_profile ;su 会读取~/.bashrc
history | tail -7 查看历史命令
jobs -l 显示所有作业的PID,作业号,状态,命令行
fg和bg将指定的作业带到前后台。 fg %2(jobs的作业号) 按下Ctrl与z 可以将一个正在前台执行的命令放到后台,并且暂停。bg $number 继续后台执行。
stat 显示文件详细属性信息
cat -ne file。tac file 翻转文件
here文档:
    cat <<EOF > file
    (内容) 
    EOF (当Shell看到"<<"的时候,它就会知道下一个词是一个分界符。在该分界符以后的内容都被当作输入,直到shell又看到该分界符(位于单独的一行)。这个分界符可以是你所定义的任何字符串。)
mktemp 在/tmp下创建文件名唯一的临时文件,在标准输出中返回文件名
join -j2 -a1 f1 f2 根据两个文件中的公共键组合文件(条件:两个文件必须按键进行排序,输入与输出文件都必须有相同的定界符)
grep -i(不区分大小写) -l(只列出匹配文件的名称) -w(只进行全字匹配) -v(反选,仅列出与模式不匹配的行) -e(多个搜索grep -e a -e b file)。
     -A(after 匹配之后) -B(before 匹配之前) -C(context 匹配前后)
     正则表达式
split -b 1m -d file 后缀名 。文件分割
touch -d "2013-01-01" file 更新文件的时间戳,修改inode细节,无法用来修改文件的更改时间。
find / -exec ls -l {} \;  find -exec对匹配的文件运行命令,文件名放在占位符{}所在位置,以分号结束(\为转义)
echo "a:b:c" | cut -d: -f1 。剪切。输出a
echo -n(不换行) -e(翻译反斜杠,\n 翻译为换行) "abc"
fmt 格式化文本行
od 查看特殊格式的文件内容
paste -d, file1 file2;seq 1 27 | paste -s(每个文件合并成行) -d"\t\t\t\n" - - (对每一个-,从标准输入中读一次数据)  与cut相反,将多个文件粘贴在一起。
pr -T -4 file 格式化
printf "%-10s %-20s" "str1" "str2" 字符串左对齐,宽度至少10个字符。
sort -k2n -k6M file 排序
uniq -u -f1 显示唯一的行,常与sort|uniq组合
dos2unix,unix2dos 
date -d "last-month" +%Y-%m-%d,date -d "1 days" 时间
factor number 生产素数因子
md5sum file,md5sum -c file.md5 文件files和该文件的file.md5文件放在同一个目录下
xargs   ls | xargs -t -i mv {} {}.bak  -i 选项告诉 xargs 用每项的名称替换 {}。 
awk '{pattern + action}' pattern 表示 AWK 在数据中查找的内容,就是要表示的正则表达式,用斜杠括起来。,而 action 是在找到匹配内容时所执行的一系列命令
awk -F ',' '/^101/ {print $1"\t"$7}' 
ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
rename 被替换掉的字符串 被替换掉的字符串 匹配要替换的文件模式 例如:rename foo foo0 foo? 
单引号(' ')和双引号类似,它不允许解释变量引用,在单引号内,除了字符单引号,每个特殊字符都只是字面的意思
vim scp://username@host//path/to/somefile vi一个远程文件
curl ifconfig.me 在内网下查看公网ip


if 语句:
    if [];then
        ...
    elif [];then
        ...
    else
        ...
    fi


    if [[ =~(.*)\.txt ]] && [ -r "$filename" ]; 正则表达式。match是 ${BASH_REMATCH[1]}
case 语句:
    case $input in
        s1) ... ;;
        s2) ... ;;
        *) ...;;
    esac
for 循环语句:
    for file in test{1,2,3}.txt 
    for fruit in $fruit   (#注:fruit="a b c")
    do
        ...
    done
    
    for (( i=1;i<10;i++ )) (#注:for i in `seq 1 10`)
    do
        ...
    done
while 循环语句:
    while [ ... ]
    do
        ... break(or continue) 2 (#注:不写默认break(continue)为1层循环)
    done
    
    while read m1 m2
    do
        ...
    done < $file1
    
    while : 无限循环
    do
        ...
    done
until 循环语句:(#测试条件和while相反)
    until [ .. ]
    do
        ...
    done
select 循环语句:
    PS3="choose your item" (#默认提示符为:'#?',可以通过PS3变量)
    select item in one two  
    do
        $REPLY,$item (#REPLY为用户输入的任何合法或者非法值,如果非法item为空,合法item为one,two其中的一个)
    done
函数:
myfunction() {   (#return返回是字节,只能表示0~255)
    echo $1
    local myvar 加上local告诉bash变量和外部的同名变量是不同的(#变量就是一个简单的linux变量,没有作用域的概念。)
}
trap myfunction 1 2 3 6 9 函数陷阱,用于捕获信号。
. ./lib 引用lib函数库。库引用库可继承
while getopts 'i:b:q' argv 传递参数
do
    case $argv in
        i) $OPTARG (参数值)
        b) ..
        q) ..
        ?) ..
    esac
done
数组赋值:
  一次一个:
    arr[1]=1
    arr[2]=2
  一次全部:
    arr=(1 2)
  按索引:
    arr=([0]=1 [1]=2 [3]=4)
  其他:
    arr=( $(cat a.txt) ),arr=( `cat a.txt` )   
    arr=( *.txt )
    arr1=( "${arr[@]}" )
    arr1+=( "${arr[@]}" )
    read -a arr
    while IFS=: read -a arr (#IFS和read写在一行,IFS只对read有效,不影响其他命令)
    do
    done < filename
数组访问:   
    ${arr[0]} 省略索引,默认访问第一个元素
    ${#arr[@]},${#arr[*]} 数组元素个数
    ${#arr[1]} arr[1]字符个数
    ${arr[@]:3},${arr[@]:3:2} 

0 0
原创粉丝点击