как добавить в сценарий дополнительные сценарии использования командной строки?

Да, поведение ожидаемое. Причина проста в том, что вы использовали двойные кавычки ( «…» ) при определении псевдонима, что позволяет заменять параметры. Это привело к замене $ VARIABLE_B во время определения псевдонима вместо его выполнения.

По сути, при записи

VARIABLE_B="original"
alias my_alias="print $VARIABLE_B"

zsh заменит $ VARIABLE_B перед запуском команды alias следующим образом:

alias my_alias="print original"

Следовательно, псевдоним my_alias всегда будет заменяться на оригинал печати перед выполнением.

Если вы хотите заменить параметр во время выполнения, вы должны заключить его в кавычки ( '…' ) или заключив $ в кавычки \ :

alias my_alias='print $VARIABLE_B'
alias my_alias="print \$VARIABLE_B"

Это установит псевдоним так, чтобы имя переменной оставалось частью команды, а псевдоним my_alias фактически заменялся на print $ VARIABLE_B перед выполнением.


Напротив, параметры внутри определения функции не нужно указывать явно, они всегда заменяются только во время выполнения.

Таким образом, при записи

my_function () {
{
    print $VARIABLE_A
}

это именно то, что будет сохранено. При запуске my_function $ VARIABLE_A будет заменен значением, которое оно имеет в то время.

0
26.05.2019, 10:48
1 ответ

Просто используйте аргумент в качестве пути. Вы можете использовать простой прием:/path/to/dir/./— это то же самое, что и /path/to/dir/, так как ./означает «текущий каталог». Итак, для этого простого случая вы можете просто сделать:

#!/bin/bash

for i in "$1"./*.mp4; do 
    ffmpeg -i "$i" "${i%.*}.mp4"; 
done

Затем запустите скрипт следующим образом:

cd /path/to/mp4; /path/to/script.sh

Или вот так (последняя косая черта обязательна):

/path/to/script.sh /path/to/mp4/

Общий способ сделать это примерно так:

#!/bin/bash

## Assign the 1st argument to the variable "target"
target=$1
## If $target has no value (if $1 was empty), set it to "."
target=${target:="."}

for i in "$target"/*.mp4; do 
    ffmpeg -i "$i" "${i%.*}.mp4"; 
done

Переменная на самом деле не нужна, вы можете просто сделать:

#!/bin/sh
for i in ${1-.}/*.mp4; do 
    echo ffmpeg -i "$i" "${i%.*}.mp4"; 
done

Или:

#!/bin/sh

if [ -z "$1" ]; then
  target="."
else
  target="$1"
fi

for i in "$target"/*.mp4; do 
    ffmpeg -i "$i" "${i%.*}.mp4"; 
done
0
28.01.2020, 03:39

Теги

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