【问题标题】:How to write a bash shell script which takes one argument (directory name)如何编写一个带有一个参数(目录名)的 bash shell 脚本
【发布时间】:2016-12-04 06:14:57
【问题描述】:

如何编写一个名为 '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 扩展名的文件名,但是它不被接受。

【问题讨论】:

  • 很多事情没有意义。第一个if 子句是干什么用的?无论如何,您永远不会使用name。为什么echo $filename/dev/null?它什么都不做。

标签: linux bash shell unix


【解决方案1】:

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

#!/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

【讨论】:

  • 但第二部分说:修改用于创建将放入“文件名”变量的循环值的命令替换。不仅仅是“ls $1”,而是将输出通过管道传输到“grep”中。 “grep”将搜索所有不以“.xyz”结尾的文件名。这可以使用“grep -v”选项轻松完成。使用这种方法,您可以摆脱循环内的“echo ... | grep ...”和“if”控制结构,只需进行重命名即可。这些说明参考了我发布的原始代码,因此我不确定如何为此修改您的程序
【解决方案2】:

第二部分的答案是这样的:

#!/bin/bash
for file in $(ls -1 "$1" | grep -v '\.old$'); do
mv "$file" "$file.old"
done

我从某处得到它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-10
    • 2020-07-22
    • 1970-01-01
    • 2012-08-22
    • 2012-10-11
    • 2017-04-18
    • 2012-05-21
    • 2014-09-01
    相关资源
    最近更新 更多