想用shell脚本实现对一个文件夹里所有的图片的像素转换
这里错误的几个地方:
1.定义变量时,变量名不加美元符号($),如:
variableName="value" (字符串的定义)
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
- 首个字符必须为字母(a-z,A-Z)。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
2.使用一个定义过的变量,只要在变量名前面加美元符号($)即可,如:
- your_name="mozhiyan"
- echo $your_name
- echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
- for skill in Ada Coffe Action Java
- do
- echo "I am good at ${skill}Script"
- 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跟字符串有很多关系,毕竟你在终端输入的命令都是以字符串形式输入的。