Проще всего использовать awk
и сказать ему напечатать последнее поле:
$ echo "$name" | awk '{print $NF}'
a.resolvers.level3.net
Конечно, если вам нужен только IP-адрес сервера, вы также можете получить это в name
в первую очередь, чтобы вам не нужно было обрабатывать его позже:
name=$(host $server | awk '{print $NF}')
Вы вызываете свой сценарий с
./script file_*.jpg jpg bak
Но *
расширяется перед передачей сценарию. Предположим, что у вас есть файлы file_1.jpg
, file_2.jpg
и file_3. jpg
в вашей папке, вот что будет вызвано:
./script file_1.jpg file_2.jpg file_3.jpg jpg bak
что означает, что ${1} = file_1.jpg
, ${2} = file_2.jpg
и ${3} = file_3.jpg
.
Возможно, будет лучше, если вы напишете свой скрипт так, что (в вашем примере): ${1} = jpg
и ${2} = bak
. Тогда вы сможете хранить эти переменные в своем скрипте, вызывать shift 2
, чтобы избавиться от них, и перебирать все позиционные аргументы, просто используя
for file; do
# do something
done
Вот код, который я придумал, основываясь на советах @pfnuesel и @Stéphane Chazelas:
#!/bin/bash
preview="false"
found="false"
if [ $# -eq 0 ]; then
echo "Syntax: ren [-p] expression replacement files..."
else
if [ "$1" == "-p" ] || [ "$1" == "-P" ]; then
preview="true"
shift
fi
expression=$1
replacement=$2
shift 2
for file; do
if [ -f "$file" ]; then
found="true"
if [ "$preview" == "true" ]; then
echo mv -i -- "${file}" "${file/$expression/$replacement}"
else
mv -i -- "${file}" "${file/$expression/$replacement}"
fi
fi
done
if [ "$found" != "true" ]; then
echo >&2 "Couldn't find files with the specified wildcard"
exit 1
fi
fi