[英]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)`.)
如果文件名可以包含空格,則需要考慮使用雙引號,尤其是在basename
和dirname
的調用中。
嘗試用 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.