簡體   English   中英

如何編寫一個帶有一個參數的bash shell腳本(目錄名)

[英]How to write a bash shell script which takes one argument (directory name)

如何編寫一個名為'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”而不是模糊文件名,或者您將進入子目錄。

編輯:問題的上半部分已在下面得到解答,但第二部分要求我根據以下說明修改我自己的代碼:

修改用於創建將放入“filename”變量的循環值的命令替換。 而不只是“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

第二部分的答案是:

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

我是從某個地方得到的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM