Как вызвать скрипт с шаблоном wildcard и еще двумя аргументами?

Проще всего использовать awk и сказать ему напечатать последнее поле:

$ echo "$name" | awk '{print $NF}'
a.resolvers.level3.net

Конечно, если вам нужен только IP-адрес сервера, вы также можете получить это в name в первую очередь, чтобы вам не нужно было обрабатывать его позже:

name=$(host $server | awk '{print $NF}')
0
17.11.2016, 01:28
2 ответа

Вы вызываете свой сценарий с

./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
4
28.01.2020, 02:19

Вот код, который я придумал, основываясь на советах @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
0
28.01.2020, 02:19

Теги

Похожие вопросы