美文网首页
shell笔记

shell笔记

作者: 不要和哥闹 | 来源:发表于2021-04-02 12:29 被阅读0次

1、Mac下shell别名,可以在/etc/bashrc 或者~/.bash_profile添加

alias grep='grep --color=auto'

2、变量赋值等号两边每空格

A="Hello world"

3、expr 运算符两边有空格

expr 2 + 3

4、条件判断[ 条件判断 ] [[ 条件判断 ]]两边有空格

5、条件判断中运算符两边有空格

[ ! $(id -u) -eq 0 ] && echo "ABC"

5、表达式

#表达式空格可有可无,两个表达式相等
$((1+3))
$[1+3]

6、类C风格((A=1))赋值,((A==B))判等

7、如果需要在文件中替换多个相同的字符串,需要添加global参数g,即:

sed -i ".bak" "s/1.*/aa\/bb/g" test.txt
或者
#https://blog.csdn.net/toopoo/article/details/104432196
sed -i ".bak" "s|1.*|aa/bb|g" test.txt

8、字符串操作

${#string} : $string 的长度
${string:position} : 从$position位置开始的子字符串
${string:position:length} : 从$position位置开始,长度为length的子字符串
${string#substring} : 从头开始,删除最短匹配$substring的字符串
${string##substring} : 从头开始,删除最长匹配$substring的字符串
${string%substring} : 从结尾开始,删除最短匹配$substring的字符串
${string%%substring} : 从结尾开始,删除最长匹配$substring的字符串
${string/str1/str2} : 使用str2替换第一个匹配的$str1
${string//str1/str2} : 使用str2替换所有匹配的$str1
${string/#str1/str2} : 如果$string的前缀和$str1匹配,用$str2替换$str1
${string/%str1/str2} : 如果$string的后缀和$str1匹配,用$str2替换$str1


${file-my.file.txt} :假如$file 沒有设定,則使用my.file.txt 作传回值。(空值及非空值時不作处理) 
${file:-my.file.txt} :假如$file 沒有設定或為空值,則使用my.file.txt 作傳回值。(非空值時不作处理)
${file+my.file.txt} :假如$file 設為空值或非空值,均使用my.file.txt 作傳回值。(沒設定時不作处理)
${file:+my.file.txt} :若$file 為非空值,則使用my.file.txt 作傳回值。(沒設定及空值時不作处理)
${file=my.file.txt} :若$file 沒設定,則使用my.file.txt 作傳回值,同時將$file 賦值為my.file.txt 。(空值及非空值時不作处理)
${file:=my.file.txt} :若$file 沒設定或為空值,則使用my.file.txt 作傳回值,同時將$file 賦值為my.file.txt 。(非空值時不作处理)
${file?my.file.txt} :若$file 沒設定,則將my.file.txt 輸出至STDERR。(空值及非空值時不作处理)
${file:?my.file.txt} :若$file 没设定或为空值,则将my.file.txt 输出至STDERR。(非空值時不作处理)

${#var} 可计算出变量值的长度:

9、从文本中读取字符串命令执行

awk '/^TN/{ cmd=$0; system(cmd) }' $SRCROOT/../README.md

10、获取当前目录

project_path=$(cd "`dirname "$0"`"; pwd)
#当前目录
cur_dir=$(pwd)
#上级目录
highter_dir=$(dirname "$(pwd)")

获取路径最后一个名字

project_path=$(cd "`dirname "$0"`"; pwd)
#当前目录
cur_dir=$(pwd)
#上级目录
highter_dir=$(dirname "$(pwd)")

11、懒加载代码

#!/bin/bash
iosBatchLazyCode(){
    
    if test $1 = "UIButton" ; then
        str="[$1 buttonWithType:UIButtonTypeCustom];"
    else
        str="[[$1 alloc]init];"
    fi
  echo -e "
- ($1 *)$2{
    if (_$2 == nil) {
        _$2 = $str
    }
    return _$2;
}" 
}

#追加一行空格
echo -e '\n' >> propertys.txt

#读取文件存数组
i=0
while read line
do
    lineStr=$line
    noneSpaceStr=${lineStr// /}
    ARR[$i]=$noneSpaceStr
    let i+=1
done < propertys.txt

#格式化输出到out.txt
for str in ${ARR[*]}
do
    a=${str#*)}
    b=${a%"*"*}

    c=${str#*"*"}
    d=${c%*;}
    iosBatchLazyCode $b $d 
done >> out.txt 

12、创建文件

RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt
> "$RESOURCES_TO_COPY"

13、字符串正则匹配

str1=我是中国人
if [[ "$str1" == 我是* ]]; then
     echo 有前缀
else
     echo 没有前缀
fi

14、文件重命名

#转自 https://blog.csdn.net/kwame211/article/details/76019823
0、用类似 GPRename 这样的图形软件进行批量重命名

#1、删除所有的 .bak 后缀:
rename 's/\.bak$//' *.bak

#2、把 .jpe 文件后缀修改为 .jpg:
rename 's/\.jpe$/\.jpg/' *.jpe

#3、把所有文件的文件名改为小写:
rename 'y/A-Z/a-z/' *

#4、将 abcd.jpg 重命名为 abcd_efg.jpg:
for var in *.jpg; do mv "$var" "${var%.jpg}_efg.jpg"; done

#5、将 abcd_efg.jpg 重命名为 abcd_lmn.jpg:
for var in *.jpg; do mv "$var" "${var%_efg.jpg}_lmn.jpg"; done

#6、把文件名中所有小写字母改为大写字母:
for var in `ls`; do mv -f "$var" `echo "$var" |tr a-z A-Z`; done

#7、把格式 *_?.jpg 的文件改为 *_0?.jpg:
for var in `ls *_?.jpg`; do mv "$var" `echo "$var" |awk -F '_' '{print $1 "_0" $2}'`; done

#8、把文件名的前三个字母变为 vzomik:
for var in `ls`; do mv -f "$var" `echo "$var" |sed 's/^.../vzomik/'`; done

#9、把文件名的后四个字母变为 vzomik:
for var in `ls`; do mv -f "$var" `echo "$var" |sed 's/....$/vzomik/'`; done

#10. 把.txt变成.txt_bak 的后缀
ls *.txt|xargs -n1 -i{} mv {} {}_bak
# xargs -n1 –i{} 类似for循环,-n1意思是一个一个对象的去处理,-i{} 把前面的对象使用{}取代,mv {} {}_bak 相当于 mv 1.txt 1.txt_bak

find ./*.txt -exec mv {} {}_bak \;  
#这个命令中也是把{}作为前面find出来的文件的替代符,后面的”\”为”;”的脱意符,不然shell会把分号作为该行命令的结尾.


==================================================================

既然要批量替换文件名,那么肯定得用一个for循环依次遍历指定目录下的每个文件。对于每个文件,假如该文件的名称为name.oldext,那么我们必须原始文件名中挖出name,再将它与新的文件扩展名newext拼接形成新的文件名name.newext。依照这样的思路,就诞生了下面的脚本:
#!/bin/bash
oldext="JPG"
newext="jpg"
dir=$(eval pwd)

for file in $(ls $dir | grep .$oldext)
        do
        name=$(ls $file | cut -d. -f1)
        mv $file ${name}.$newext
        done
echo "change JPG=====>jpg done!"

        下面对针对这个程序作简单说明:
1.变量oldext和newext分别指定旧的扩展名和新的扩展名。dir指定文件所在目录;
2.“ls $dir | grep .$oldext”用来在指定目录dir中获取扩展名为旧扩展名的所有文件;
3.在循环体内先利用cut命令将文件名中“.”之前的字符串剪切出来,并赋值给name变量;接着将当前的文件名重命名为新的文件名。
        通过这个脚本,所有照片的扩展名都成功修改。为了使这个脚本更具有通用型,我们可以增加几条read命令实现脚本和用户之间的交互。改进版的脚本如下:
#!/bin/bash
read -p "old extension:" oldext
read -p "new extension:" newext
read -p "The directory:" dir
cd $dir

for file in $(ls $dir | grep .$oldext)
        do
        name=$(ls $file | cut -d. -f1)
        mv $file ${name}.$newext
        echo "$name.$oldext ====> $name.$newext"
        done

echo "all files has been modified."
        修改后的脚本可以批量修改任意扩展名。

Shell批量重命名文件名
#!/bin/sh
#替换文件名中的空格
find . -name "* *"|
while read name;do
    na=$(echo $name | tr ' ' '_')
    mv "$name" $na
done

#将文件名替换成1、2、3、4、5、6等文件名,后缀名保持不变(例如test.log -->1.log)
for file in `find . -type f -name "*"`;do 
dirname=`dirname $file`

 i=`expr $i + 1`;
#获取文件后缀名
 P="${file##*.}"
echo $file $dirname/$i.$P;

mv $file $dirname/$i.$P;
done

相关文章

  • linux shell脚本攻略笔记

    LINUX SHELL脚本攻略笔记[速查] linux shell脚本攻略笔记

  • Shell十三问 学习笔记

    文本处理 Shell脚本编程 Shell 十三问 学习笔记 shell and Carriage 关系 Shell...

  • Shell脚本

    shell脚本学习笔记 shell命令的组合运用 常用命令组合

  • Shell入门笔记

    本笔记参考 Linux探索之旅 1.什么是Shell 2.Shell种类 3.Shell脚本文件 4.Shell变...

  • Shell 学习笔记

    Shell 学习笔记 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是...

  • 1.1 开始

    《Linux Shell 脚本攻略(第 2 版)》读书笔记 Bash (Bourne Again Shell)是目...

  • SHELL 笔记

    shell笔记 判断语句 运算 选择语句 循环语句 将shell字句执行结果复制给变量 shell简单传参 编号变...

  • 1.11 调试脚本

    《Linux Shell 脚本攻略(第 2 版)》读书笔记 启用 shell 脚本的跟踪调试功能bash -x s...

  • Linux操作系统命令汇总

    SHELL脚本学习笔记 标签(空格分隔): linux shell脚本 1. 常用命令汇总 alias 设置别名u...

  • shell script学习笔记

    shell学习笔记 什么是shell? shell是运行在linux服务器上的用c语言编写的程序,即可以是服务器端...

网友评论

      本文标题:shell笔记

      本文链接:https://www.haomeiwen.com/subject/tknfkltx.html