Как передать аргументы определенной функции в сценарии оболочки? - PullRequest
0 голосов
/ 13 мая 2018

Я пытаюсь создать функцию, в которой я передаю две даты в качестве аргументов и определяю их день недели.Я заставил его работать, скопировав и вставив процесс синтаксического анализа для обеих входных дат, но я пытаюсь сэкономить пространство, сжимая процесс в определенную функцию.Входные данные должны выглядеть так:

datematch.sh 01/03/1984 06/12/2008

Но я продолжаю получать сообщения об ошибках в виде строк:

./birthday_match.sh: line 9: ${$1:0:2}: bad substitution
./birthday_match.sh: line 9: ${$1:0:2}: bad substitution
The first person was born on: 
The second person was born on: 
Thus, they were born on the same day.

Как я заменяю неправильно?Полный код приведен ниже.

#!/bin/bash
var1=$1
var2=$2
if [ "$#" -ne 2 ]; then
    echo "illegal number of birthdays"
else
    function get_dayname () 
    {
        mo=${$1:0:2}
        dy=${$1:3:2}
        yr=${$1:6:4}
        combo="${mo}${dy}0000${yr}"
        fulldate="$(date $combo 2> /dev/null)"
        wkdy=${fulldate:0:3}
        eval $wkdy
    }
    first=$(get_dayname "$var1")
    second=$(get_dayname "$var2")
    echo "The first person was born on: $first"
    echo "The second person was born on: $second"
    if [ "$first" == "$second" ]; then
        echo "Thus, they were born on the same day."
    else
        echo "Thus, they were not born on the same day."
    fi
fi

1 Ответ

0 голосов
/ 13 мая 2018

Неверный синтаксис расширения параметра:

mo=${$1:0:2}

должен быть

mo=${1:0:2}

Рассмотрим простой случай.Подставляя первый аргумент как есть, можно либо $1, либо ${1}.Во второй версии фигурные скобки служат для отделения имени или номера переменной от следующего.

Если вы написали ${$1}, интуитивное значение будет означать «обрабатывать первый аргумент как имя и заменятьзначение переменной с , что name ".... но синтаксис расширения параметров bash не позволяет этого.

...