Linux Shell编程

Shell 命令行批量处理图片文件名

一、什么是Shell
在Linux中,系统会为每个用户运行一个shell(外壳)程序。
shell程序是一个命令行解释器,交互式地解释和执行用户输入的命令。
shell还是一种解释性的程序设计语言,定义了变量和函数,数组,程序控制结构等很多高级语言支持的特性。

前言:

二、shell编程用在什么地方
shell一般用于批量命令执行,用来管理,监控系统等。

从网上下载了一堆图片,有的是*.jpg的,有的是*.jpeg的。并且文件名有长有短,很是糟心。因此,我想把这些文件给全部整理好,当然是用shell来处理啦!

三、shell语法详解
1.程序示例,输出"hello world"
firstshell

说干就干。

#!/bin/bash
echo "hello world"

循环所有文件

改变文件的访问权限,使其具有可执行属性
chmod x firstshell

首先,我把所有的乱七八糟的图片,全部放在 ./image/ 这个文件夹下面。

输出结果:

然后在外层写一个i.sh的shell文件,录入下面的内容。

威尼斯人棋牌 1

我的文件结构演示如下:

程序的第一行必须是 #!/bin/bash
指定系统用#!后的命令/bin/bash来运行此文件。

文件
image/xxx.jpg
image/xxx.jpeg
i.sh

2.变量
varname=值
需要注意的是:
1)"="前后不能有空格
2)变量默认都是字符串格式的
3)使用变量,必须加上"$"符号,否则取到的是变量名本身
4)若变量名和其他字符串混淆在一起时,需要加上{}来区分变量名
如下例所示:
myshell

for f in $(find ./image -iname "*.*"); do
 echo $f
done
#!/bin/bash
var1=1
var2=2
var3=$var1 $var2 #变量默认是字符串,所以输出为1 2
var4 =4 #等号前后有空格,报错
echo $var1
echo $var2
echo $var3
echo $var4
echo "var1 is the ${var1}st"

然后执行 sh i.sh 命令,顺利在命令行里面输出了所有的图片文件。

输出结果:

实现 i 数字效果

威尼斯人棋牌 2

我想把图片全部命名为 1.jpg 2.jpg 这样的图片文件,所以就需要一个类似于js的i 效果。

那么,我们如何将var1,var2作为数值类型来相加呢?
方法一:使用C风格表示式,((表示式))
((var3=$var1 $var2))
或((var3=var1 var2))

于是,把上面代码修改为

方法二:使用shell中的let命令
let 'var3=var1 var2' #注意不能加'$'符号,否则报错

# 搞一个i的变量
i=1
for f in $(find ./image -iname "*.*"); do
 ## 打印 i
 echo $i
 echo $f
 ## 计算i  
 ((i  ))
done

方法三:调用expr外部程序,效率较低,尽量少用
var3=$(expr $var1 $var2) #expr函数需要三个参数,$var1, ,$var2

OK,已经顺利的输出了数字了。到这一步就很明显的得到了我们想要的,下面只要把文件给复制一下就好了。

3.流程控制
1)if语句
结构如下:

实现重命名效果

if
then
elif
then
else
fi
# 搞一个i的变量
i=1
mkdir img
for f in $(find ./image -iname "*.*"); do
 cp $f ./img/$i.jpg
 ## 计算i  
 ((i  ))
done

或者(then写在if的后面,但是要加分号;)

好,如上,我们就将图片全部根据数字重命名,并且放到了一个新的img文件夹中。我们想要的效果就实现了。

if ...;then
elif...;then
else
fi

用MD5值命名图片

示例如下:
myshell

突然想到,数字这东西不靠谱,下次不小心执行了,很容易把图片给搞乱掉,还是MD5值靠谱,并且注意,还能过滤同样的图片。

#!/bin/bash
var1=1
var2=2
if ((var1==var2))
then
    echo "var1=var2"
elif ((var1>var2))
then
    echo "var1>var2"
else
    echo "var1<var2"
fi

嗯,理想很丰满,我们来看看。

输出结果:

md5 -q $file

威尼斯人棋牌 3

可以输出文件的MD5计算值。就用这个了。改造上面代码如下:

bash中有一些常用的条件判断表达式,使用方法:[ 条件判断表达式 ]
-f "filename":判断是否是文件
-x "/bin/ls":判断/bin/ls是否存在并有可执行权限
-n "$var":判断$var变量是否有值
"$a"=="$b":判断$a和$b是否相等

mkdir img
for f in $(find ./image -iname "*.*"); do
 # 计算MD5值,并赋予一个变量
 a=$(md5 -q $f)
 # 复制文件
 cp $f ./img/$a.jpg
done

2)&&和||操作符
&&:逻辑与操作符
||: 逻辑或操作符

我是想拿这一堆文件重复实现,所以用复制,如果不需要这样考虑,完全可以使用mv重命名,代码如下:

3)case语句
case表达式用来匹配给定的字符串,和C中的switch...case匹配的是数字不同。

mkdir img
for f in $(find ./image -iname "*.*"); do
 # 计算MD5值,并赋予一个变量
 a=$(md5 -q $f)
 # 复制文件
 mv $f ./image/$a.jpg
done
case ... in
...) 
    do something;;
...)
    do something;;
esac

以上所有命令均基于MAC系统运行。如果是Linux 可能有细微差异。

下例中,我们写了一个程序,用来解压bzip2,gzip,zip类型的压缩文件。
威尼斯人棋牌,代码如下:

 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

#!/bin/bash
ftype=$(file $1)
echo "$ftype"
case "$ftype" in
"$1: Zip archive"*)
    unzip "$1";;
"$1: gzip compressed"*)
    gunzip "$1";;
"$1: bzip2 compressed"*)
    bunzip2 "$1";;
*)
    echo "File $1 can not be unconpressed";;
esac

您可能感兴趣的文章:

输出结果:

威尼斯人棋牌 4

其中$1表示输入的第一个参数

4)select循环语句
select循环适合交互式的场合,格式如下:

select var in ...;do
...
done

示例代码如下:

#!/bin/bash
echo "what is your favourite OS?"
select var in "RedHat" "Ubuntu" "Free BSD" "Other";do
    echo "hello $var"
    break;
done
echo "you have selected $var"

本文由威尼斯人棋牌发布于计算机教程,转载请注明出处:Linux Shell编程