linux - 如何编写一个带一个参数(目录名)的 bash shell 脚本

标签 linux bash shell unix

如何编写一个名为“abc”的 bash shell 脚本,它接受一个参数,一个目录的名称,并将扩展名“.xyz”添加到目录中所有还没有它的可见文件

我主要编写了更改当前目录中文件名的代码,但我无法让脚本接受参数(目录名)并更改该目录的文件名

#!/bin/bash
case $# in
0) echo "No directory name provided" >&2 ; exit 1;;
1) cd "${1}" || exit $?;;
*) echo "Too many parameters provided" >&2 ; exit 1;;
esac

for filename in *
do
echo $filename | grep "\.xyz$"
if [ "$?" -ne "0" ]
then mv "$filename" "$filename.old"        
fi
done

附加说明包括; 在“abc”中,使用“for”控制结构循环遍历所有非隐藏文件名 在 $1 中的目录名称中。另外,使用命令替换 使用“ls $1”而不是模棱两可的文件名,否则您将进入子目录。

编辑:问题的顶部已在下面得到回答,但是第二部分要求我根据以下说明修改自己的代码:

修改用于创建将放入“文件名”变量的循环值的命令替换。不仅仅是“ls $1”,而是将输出通过管道传递到“grep”。 “grep”将搜索所有不以“.xyz”结尾的文件名。这可以使用“grep -v”选项轻松完成。使用这种方法,您可以摆脱循环内的“echo ... | grep ...”和“if”控制结构,只需进行重命名即可。

我将如何实现这一点,因为根据我的理解,下面的答案已经只搜索没有 .xyz 扩展名的文件名,但是它没有被接受。

最佳答案

您的描述在某些地方有点不清楚,所以我选择了最明显的:

#!/bin/bash

# validate input parameters
case $# in
    0) echo "No directory name provided" >&2 ; exit 1;;
    1) cd "${1}" || exit $?;;
    *) echo "Too many parameters provided" >&2 ; exit 1;;
esac

shopt -s extglob # Enables extended globbing

# Search for files that do not end with .xyz and rename them (needs extended globbing for 'not match')
for filename in !(*.xyz)
do
    test -f && mv "${filename}" "${filename}.xyz"
done

关于linux - 如何编写一个带一个参数(目录名)的 bash shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40955996/

相关文章:

linux - 我可以在终端中执行文本文档中编写的命令吗

linux - 从 grep 结果中提取字符串

linux - Apache2 将 https 重定向到没有证书的 http

c - 如何在 Mac OS X 中获得与 Linux gcc/gnu crypt(3) 相同的 crypt(3) 函数? Linux gcc crypt(3) 有 MD5 和 SHA512。 Apple Gcc crypt(3) *仅* 使用 DES

linux - 如何使用 awk 在模式后添加多行

linux - 为什么 ((counter++)) 在 counter == 0 时失败?

algorithm - 计算 BASH 中一个文件中两个连续数字的顺序在第二个文件中颠倒的次数

linux - 在CENTOS6.8中使用shell移动文件夹但保留前面的结构

linux - 编写我自己的内核

c - 您使用什么工具来衡量绩效?