expr: нецелочисленный аргумент
#!/bin/bash
function koiwin
{
num="$(cat $1)"
for i in ${num[*]}
do
low=$low"\3$i"
up=$up"\3`expr $i + 40`"
done
echo $up$low
return
}
if test $# -lt 3
then echo "Usage: `basename $0` tablica.txt input.win output.koi"
exit 7
fi
if ! test -f $2 # Проверка существования входного файла
then echo "$2: No such regular file" >&2
exit 2
fi
if ! test -r $2 # Контроль доступа чтения для входного файла
then echo "$2: Permission denied to read" >&2
exit 13
fi
# Контроль маршрутного имени для выходного файла
curdir=`pwd`
outdir=`expr $3 : '\(.*/\)' \| $curdir`
if [ ! -w $outdir -a ! -e $3 ] # Контроль каталога по (пере)записи
then echo "$outdir: Permission denied to write" >&2
exit -13
fi
if test -d $3 # Проверка, что выходной файл не каталог
then echo "$3: Is directory" >&2
exit 21
fi
if [ -e $3 -a ! -w $3 ] # Контроль перезаписи выходного файла
then echo $3: Permission denied to rewrite
exit 13
fi
if [ -f $3 ]
then while [ 1 > 0 ]
do echo "$2 already exists. Would you like to rewrite it? (y/n)"
read ans
if [ "$ans" == "n" ]
then exit 1
elif [ "$ans" == "y" ]
then cat $2 | tr `koiwin` "\300-\337\340-\377" > $3
exit 0
else
echo "Error"
exit 1
fi
done
fi
cat $2 | tr `koiwin` "\300-\337\340-\377" > $3
После запуска:
./koiwin.sh table.txt sometext.koi sometext.win
expr: нецелочисленный аргумент
expr: нецелочисленный аргумент
table.txt:
01 02 27 07 04 05 26 32 11 12 13 14 15 16 17 20 22 23 24 25 06 10 03 36 33 35 37 31 30 34 00 21
При этом тут все работает:
#! /bin/bash
num="$(cat $1)"
for i in ${num[*]}
do
low=$low"\3$i"
up=$up"\3`expr $i + 40`"
done
echo $up$low
Вывод:
./test.sh table.txt
\341\342\367\347\344\345\366\372\351\352\353\354\355\356\357\360\362\363\364\365\346\350\343\376\373\375\377\371\370\374\340\361\301\302\327\307\304\305\326\332\311\312\313\314\315\316\317\320\322\323\324\325\306\310\303\336\333\335\337\331\330\334\300\321
В чем может быть проблема?
Ответы (1 шт):
Автор решения: Ivan
→ Ссылка
Это распротраненная ошибка. Вы путаете аргументы функции и аргументы скрипта. Вот простой пример:
$ cat test
#!/bin/bash
fun(){ echo "$1"; }
echo run fun
fun
echo args
echo "$1"
echo fun with args
fun "$1"
Попробуем запустить:
$ ./test test
run fun
args
test
fun with args
test
Функция без аргументов не вывела ничего, хотя скрипту передан аргумент "test". Дело в том что переменные типа $1,2,3... внутри функции не являются указателями аргументов скрипта, это указатели на аргументы переданные самой функции. Если вам нужно обработать информацию переданную через аргументы скрипта какой-либо функцией, вы должны передать соотв. аргумент в функцию, вот так:
fun(){ echo "$1"; }
fun "$1"
Либо создать переменные для аргументов скрипта и использовать их в функциях:
#!/bin/bash
arg1=$1
fun(){ echo "$arg1"; }
fun