shell命令总结(一)

很久没写shell脚本了,最近在帮助新同学学习shell,所以也顺便整理一下,算是一个学习笔记。

使用变量

首先显示消息,最基本的echo命令,echo后面的字符串会直接显示控制台显示器上。

echo  "this is shell"

看个人习惯吧,单引号,双引号都可以,不加也可以。如果字符串中含有单引号或者双引号,就用另一种将字符串划定起来,这边的变量可以是环境变量也可以是用户变量。

  • 环境变量
echo HOME:$HOME   ----HOME:/home/work
echo PATH:${PATH}     HOME:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/opt/apps/openresty/nginx/sbin:/opt/apps/php/bin:/home/work/.local/bin:/home/work/bin
echo PATH:\$PATH       -----HOME:$PATH  \允许shell将$解读为实际的美元符号
  • 用户变量
name="shell"
echo {name} 或者echo name    ----shell
name2=$name
echo name2   ----shell

字符串相关

name="this is mike"
echo ${name}   --- this is mike
echo ${#name}  ---12  获取字符串长度
  • 字符串截取
echo ${name:0:4}  ---从左往右第一个截取至第四个  this
echo ${name:4}  --- 从左往右第四个开始截取至最后  is mike
echo ${name:0-4:7}  ---从右往左算起0-4个,截取3个   mik
echo ${name:0-4}   ---从右往左截取4个   is mike
echo ${name#*s}  --- 从第一个s截取   is mike
echo ${name##*s}  --- 贪婪匹配  mike
echo ${name%i*}   ---从右往左匹配  this is m
echo ${name%%i*}   ---贪婪匹配  th
  • 字符串替换
echo ${name/is/iss}  ---替换第一个is   thiss  is mike
echo ${name//is/iss}  ---贪婪匹配,替换所有is   thiss iss mike
echo ${name/#*s/iss} --- iss mike
echo ${name/%i*/iss}  --- thiss
  • expr的字符串操作
expr index "$name" i --- 3 查找i的索引(从1开始计数)
expr length "$name"   ---name的长度
expr match "$name" this ---4  
expr substr "$name" 3 4   ---  s is  返回一个以 StartPosition 的字符开始的在 String1 中的字符串,并且是 Length 长度的字符串(substr String1 StartPosition Length)

数组相关

数组也是用户变量的一种,能够存储多个值的变量,可以单独引用,也可以作为整个数组来引用

  • 数组定义
name=(this is mike)
-------------------
name[0]=this
name[1]=is
name[2]=mike
-------------------
str="this is mike"
name=($str)
  • 操作数组
name=(hello everyone my name is mike)
echo ${name}   --- hello
echo ${name[2]}  --- my
echo ${name[@]}  ---hello everyone my name is mike  (通配符也可以换乘 *)
-------------------
echo ${#name[*]}   ---  6  数组长度
-------------------
name[3]=haha        ---数组赋值
echo ${name[*]}  --- hello everyone my haha is mike
name[6]=haha
echo ${name[*]}  --- hello everyone my haha is mike haha
name2=(${name[*]} haha)      新数组=(旧数组  新元素)
echo ${name2[*]}  --- hello everyone my haha is mike
-------------------    数组切片
echo ${name[*]::2}  ---hello everyone   从索引为0往后打印2位
echo ${name[*]:1:2} ---everyone my   从索引为1往后打印2位
echo ${name[*]:2} ---my name is mike 从索引为2往后全部打印
echo ${name[*]:(-4:2)}  --- name is  从倒数第四个往后打印2位
------------------- 数组替换
echo ${name[*]/e/E}  --- 将每一个元素中第一个e替换为E  hEllo Everyone my namE is mikE
echo ${name[*]//e/E}  --贪婪匹配,将所有e都替换  hEllo EvEryonE my namE is mikE
echo ${name[*]/e/}  ---如果后面不跟替换的值,可以理解为删除, hllo veryone my nam is mik 
echo ${name[*]/#m/M}  ---每个元素最左边的m,替换为M
echo ${name[*]/%e/E}  ---每个元素最右边的e,替换为E
------------------- 数组匹配
echo ${name[*]#*e} --- llo veryone my is  *e的部分都会被删除
echo ${name[*]##*e}  ---贪婪匹配  llo my is 
  • 数组遍历
for i in ${name[*]}
do
    echo $i
done

重定向

用得比较多的是输出重定向,将某个命令的输出不仅仅是显示在控制器显示器上,而是重定向到一个文件中。

today=$(date +%Y%m%d)
ls  >log.$today   

这边有两个点:

  • 将date格式化后传给变量today,today值为20180626
  • 重定向

查看log.20180626

$ cat log.20180626 
log.20180626
try.sh

使用> 如果输出文件已经存在了,会用新的文件覆盖已有文件,如果不想覆盖原来文件的内容,想在原有文件基础上追加,使用>>来追加数据

pwd >>log.$today   

检查文件

$ cat log.20180626 
log.20180626
try.sh
/home/work/hpc/test/shell

以上仅仅是一部分,最近会陆续更新相关学习笔记。

    原文作者:迈阿密小白
    原文地址: https://www.jianshu.com/p/e8ebe008c153
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞