shell写的一个小脚本

Posted 去做点事情

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell写的一个小脚本相关的知识,希望对你有一定的参考价值。

想用shell脚本实现对一个文件夹里所有的图片的像素转换

这里错误的几个地方:

1.定义变量时,变量名不加美元符号($),如:

  variableName="value"  (字符串的定义)

注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:

  • 首个字符必须为字母(a-z,A-Z)。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

2.使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:

  1. your_name="mozhiyan"
  2. echo $your_name
  3. echo ${your_name}

变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:

  1. for skill in Ada Coffe Action Java
  2. do
  3. echo "I am good at ${skill}Script"
  4. done

如果不给skill变量加花括号,写成echo "I am good at $skillScript",解释器就会把$skillScript当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。推荐给所有变量加上花括号,这是个好的编程习惯。

3.变量运算:

s=0                                    #定义一个求和变量,初值为0。

t=`expr$1**$2`                        #用expr改变运算顺序,求x的y次方。

t=$[t*3]                               #t乘以3。

s=$[s+t]                               #结果相加。

t=$[$1**2]                             #求x的平方。

t=$[t*4]                               #结果乘以4。

s=$[s+t]                               #结果相加。

t=`expr$2*5`                          #求5y的值。

s=$[s+t]                               #结果相加。

s=$[s+6]                               #结果加上6。

echo$s                                #输出结果。

echo$((a%b))                          #取余

 

正确代码:

#!/bin/bash

#mkdir detection-crowdai_new

count=0
for image in $(ls detection-crowdai)
do
    count=$[count+1]
    echo "Hello World !"
  echo $image
#convert -resize 800x500 image image done echo $count

$(ls detection-crowdai)相当于一个变量了,实现了对文件夹里所有文件的访问。echo $image能显示文件夹下所有的文件名

detection-crowdai是在~下的,因为这个shell脚本就在~目录下,所以不要加绝对路径:/home/bnrc/detection-crowdai,也不要写成/detection-crowdai,这样都会报错说找不到文件。

 

 

最后正确运行的代码,这个代码还实现了图片名字没改变,只是像素大小变化了存储在另一个文件夹:

#!/bin/bash

#mkdir detection-crowdai_new


for image in $(ls detection-crowdai)
do
    dir="/home/bnrc/detection-crowdai/"
    path=$dir${image}
    echo $path
    # convert -resize 800x500 $path $abc
    #mat=".jpg"
    #newname=$image$mat
    newname=$image
    convert -resize 800x500 $path $newname
    #mv $newname /home/bnrc/detection-crowdai_new
    target=\'/home/bnrc/detection-crowdai_new\'
    mv $newname $target
done

1.生成的图片我想用shell的重定向,但显然这是不可以的。重定向是从终端将终端上显示的东西输入到文件或者其他地方。

   实际上使用mv将每次生成的图片转移到另一个文件夹就可以了。

2.字符串的连接,我这里使用了将两个字符串变量直接连接path=$dir${image},也可以直接写成path=$dir$image。这个可以很好地用到添加路径上。

3.convert这个命令:如果图片放到当前目录,直接convert+文件名就好了。如果图片在当前路径的某个文件夹里,你用/detection-crowdai+文件名,他会说找不到图片。你只能使用绝对路径/home/bnrc/detection-crowdai/才行。

4.mv $newname /home/bnrc/detection-crowdai_new会一直报错,/home/bnrc/detection-crowdai_new不是一个字符串,shell会认为这个一个变量,但这个变量又没有定义,当然会报错。

 

shell跟字符串有很多关系,毕竟你在终端输入的命令都是以字符串形式输入的。

以上是关于shell写的一个小脚本的主要内容,如果未能解决你的问题,请参考以下文章

小工具shell检测进程状态异常自动重启

查看Linux服务器网卡流量小脚本shell和Python各一例

代码片段:Shell脚本实现重复执行和多进程

Python如何调用别人写好的脚本

一个小破网站,居然比 Python 官网还牛逼

用于确保在任何给定时间仅运行一个 shell 脚本的 shell 片段 [重复]