Imprime o último caractere no caminho fornecido

0

Estou tentando concatenar "comnp.dat_CY*" arquivos em um arquivo. Nome do arquivo, caminho de origem e caminho de destino são os parâmetros. Eu estou tentando encontrar o último caractere no caminho para verificar se é "/" ou não. Mas quando tento fazer isso estou recebendo erro. Abaixo está meu script

if [ "$#" -ne 3 ]; then
    echo "Script requires 3 inputs"
    echo "1. File pattern (comnp.dat_CY)"
    echo "2. Source path"
    echo "3. Destination path"
    exit
fi

last_char1 = 'echo $2|awk -F  '{if (NF>1) {print $NF}}'
last_char2 = 'echo $3|awk -F  '{if (NF>1) {print $NF}}'

if [ $last_char1 != "/" ];then
    ap_src_path = "$2/"
fi
if [ $last_char2 != "/" ];then
    ap_dest_path = "$3/"
fi

cat $ap_src_path$1* > $ap_dest_pathcomnp.dat

Abaixo estão os meus erros:

comnp.sh: Broken pipe
comnp.sh[14]: last_char1:  not found
comnp.sh[15]: last_char2:  not found
comnp.sh[17]: test: argument expected
comnp.sh[20]: test: argument expected

O que está errado no meu roteiro?

Estou usando ksh AIX

    
por Aravind 02.12.2014 / 16:08

4 respostas

2

O problema aqui é que você não pode usar espaço em torno de = . A casca é muito exigente quanto a isso. E awk comandos são totalmente bugs.

Além disso, em 2014, use melhor $( ) do que os backticks. Então awk linhas devem ser:

last_char1=$(echo "$2" | awk '{print $NF}' FS='')
last_char2=$(echo "$3" | awk '{print $NF}' FS='')

verifique o link

    
por 02.12.2014 / 16:26
3

A atribuição de variáveis na sintaxe da shell não pode ter espaços. last_char = ... é um comando chamado last_char com os argumentos = e .... . last_char=... é uma atribuição que armazena ... na variável do shell last_char .

Esta é uma maneira muito mais eficiente e direta de fazer o que você quer:

case $2 in
  */) ap_src_path=$2;; 
  *) ap_src_path=$2/;;
esac
case $3 in
  */) ap_dest_path=$3;;
  *) ap_dest_path=$3/;;
esac

Você não precisa extrair o último caractere para fazer uma comparação simples. Além disso, a substituição de comando é ineficiente e desajeitada para manipulação de variáveis de shell simples como essa.

Mais importante, você não precisa fazer nada disso. Na maior parte, a resolução do caminho Unix não se preocupa com as barras duplicadas barras duplicadas , por isso path///to//a/file é tão válido quanto %código%. Em scripts, você pode aproveitar isso simplesmente não se preocupando com path/to/a/file duplicado. Em outras palavras, você pode substituir o script inteiro por

if [ $# -ne 3 ]; then
   # ... same as above ...
fi
pattern=$1
ap_src_path=$2
ap_dst_path=$3

cat "$ap_src_path/$pattern"* > "$ap_dest_path/compn.dat"
    
por 02.12.2014 / 16:49
2
last_char1=$(echo ${2:${#2}-1}); 
last_char2=$(echo ${3:${#3}-1}); 

if [[ "$last_char1" != "/" ]]; then 

Dicas:

por 02.12.2014 / 16:28
2

Existem vários problemas com o seu script. Os espaços em torno de = não devem estar presentes, aspas simples ' não estão emparelhadas e, além disso, awk -F requer um parâmetro - um separador de campos, portanto, você deve escrever awk -F '' '{if (NF>1) {print $NF}}' .

Mas, na verdade, se você usar um shell razoável como bash ou zsh , poderá simplesmente escrever

cat "${ap_src_path}/${1}*" > "${ap_dest_path}/comnp.dat"

sem precisar dos últimos caracteres e todas as condições if . Possíveis% adicionais/ são apenas ignoradas, portanto, por exemplo, um caminho /var//log///mysql////mysql.log é uma sintaxe perfeitamente adequada.

    
por 02.12.2014 / 16:33