簡體   English   中英

shell 字符串錯誤替換

[英]shell string bad substitution

我是 shell 編程的新手。 我打算在解壓縮 zip 文件后獲取目錄名稱。 它的打印語句是

$test.sh helloworld.zip
helloworld

我們來看一下test.sh:

#! /bin/sh
length=echo `expr index "$1" .zip`
a=$1    
echo $(a:0:length}

但是我從編譯器那里得到了錯誤的替換錯誤。

當我提到“shell”時。我只是在談論 shell,因為我不知道 bash 或其他人之間的區別。我只是使用 Ubuntu 10.04 並使用終端。 (我正在使用 bash。)

如果您的 shell 是bash的足夠新版本,則該參數擴展表示法應該有效。

在許多其他 shell 中,它不會工作,一個bad substitution錯誤是 shell 說“您要求進行參數替換,但對我來說沒有意義”的方式。


另外,給定腳本:

#! /bin/sh
length=echo `expr index "$1" .zip`
a=$1    
echo $(a:0:length}

第二行為通過運行expr index "$1" .zip生成的命令導出帶有值echo可變length 它不分配給length 那應該只是:

length=$(expr index "${1:?}" .zip)

如果未設置$1 (如果不帶參數調用腳本),則${1:?}表示法會生成錯誤。

最后一行應該是:

echo ${a:0:$length}

請注意,如果$1保存filename.zip ,則expr index $1 .zip的輸出為 2,因為字母i出現在filename.zip索引 2 處。 如果目的是獲取沒有.zip擴展名的文件的基本名稱,那么經典的方法是:

base=$(basename $1 .zip)

更現代的方式是:

base=${1%.zip}

它們是有區別的; 如果名稱為/path/to/filename.zip ,則經典輸出為filename ,現代輸出為/path/to/filename 您可以通過以下方式獲得經典輸出:

base=${1%.zip}
base=${base##*/}

或者,在經典版本中,您可以通過以下方式獲取路徑:

base=$(dirname $1)/$(basename $1 .zip)`.)

如果文件名可以包含空格,則需要考慮使用雙引號,尤其是在basenamedirname的調用中。

嘗試用 bash 運行它。

bash test.sh helloworld.zip

-同樣地-

“嘗試將第一行更改為#!/bin/bash ”作為評論回答 – @shellter

bash嘗試:

echo $1
len=$(wc -c <<< "$1")
a="${1}.zip"
echo ${a:0:$len}

調整它以滿足您的需求。

暫無
暫無

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

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