Если ваша оболочка является достаточно новой версией bash
, этот параметр нотация расширения должна работать.
Во многих других оболочках это не будет работать, и ошибка bad substitution
— это то, как оболочка говорит: «Вы запросили замену параметра, но для меня это не имеет смысла».
Кроме того, учитывая сценарий:
#! /bin/sh
length=echo `expr index "$1" .zip`
a=$1
echo $(a:0:length}
Вторая строка экспортирует переменную length
со значением echo
для команды, сгенерированной запуском expr index "$1" .zip
. Он не назначается length
. Это должно быть просто:
length=$(expr index "${1:?}" .zip)
где нотация ${1:?}
генерирует ошибку, если $1
не установлено (если скрипт вызывается без аргументов).
Последняя строка должна быть:
echo ${a:0:$length}
Обратите внимание, что если $1
содержит filename.zip
, выход expr index $1 .zip
равен 2, потому что буква i
появляется в индексе 2 в filename.zip
. Если намерение состоит в том, чтобы получить базовое имя файла без расширения .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
.
person
Jonathan Leffler
schedule
11.10.2012
echo "$1"
и т. д. Удачи! - person shellter   schedule 11.10.2012${a:0}
? - person Gilles Quenot   schedule 11.10.2012#!/bin/bash
. Удачи. - person shellter   schedule 11.10.2012/bin/sh
является bash, он выполняется так, как если бы использовался--posix
, что отключает некоторые функции bash. - person jordanm   schedule 11.10.2012/bin/sh
может бытьdash
(Debian Almquist Shell), и это очень близко к стандарту POSIX и не поддерживает расширения только для Bash. - person Jonathan Leffler   schedule 25.03.2014