it-swarm-eu.dev

Jak velkými argumenty příkazového řádku?

Hledal jsem SO a zjistil jsem, že na velká písmena bude fungovat následující řetězec)

str="Some string"
echo ${str^^}

Ale pokusil jsem se udělat něco podobného na argumentu příkazového řádku, který mi dal následující chybu

Vyzkoušeli

#!/bin/bash
             ## Output
echo ${1^^}  ## line 3: ${1^^}: bad substitution
echo {$1^^}  ## No error, but output was still smaller case i.e. no effect

Jak bychom to mohli udělat?

134
mtk

Syntaxe str^^, které se pokoušíte, je k dispozici od Bash 4.0 a výše. Možná je vaše starší verze (nebo jste spustili skript s explicitně sh):

Zkuste to:

str="Some string"
printf '%s\n' "$str" | awk '{ print toupper($0) }'
160
Guru
echo "lowercase" | tr a-z A-Z

Výstup:

LOWERCASE
96
Johner Ramirez

Buďte opatrní s tr, pokud A-Z není vše, co používáte. Pro jiné národní prostředí dokonce selže „[: nižší:]“ „[: horní:]“, funguje pouze awkova toupper a bash (v4 +)

$ str="abcåäö"
$ echo "$str"|tr '/a-z/' '/A-Z/'
ABCåäö
$ echo "$str"|LC_ALL=sv_SE tr '[:lower:]' '[:upper:]'
ABCåäö
$ echo "$str"|awk '{print toupper($0)}'
ABCÅÄÖ
$ echo ${str^^} # Bash 4.0 and later
ABCÅÄÖ
$ STR="ABCÅÄÖ"
$ echo ${STR,,}
abcåäö
25
lpaseen

Alternativně byste mohli přejít na ksh nebo zsh, kteří měli podporu převodu případů po celá desetiletí (dlouho před přidáním ${var^^}bash, ale s jinou syntaxí:

#! /bin/ksh -
typeset -u upper="$1"
printf '%s\n' "$upper"

(funguje také s zsh; v pdksh/mksh funguje pouze pro písmena ASCII).

Pomocí zsh můžete také použít příznak rozšíření parametru U:

#! /bin/zsh -
printf '%s\n' "${(U)1}"

POSIXLY můžete použít:

awk 'BEGIN{print toupper(ARGV[1])}' "$1"

K dispozici je také:

printf '%s\n' "$1" | tr '[:lower:]' '[:upper:]'

Ale v několika implementacích, včetně GNU tr, to funguje pouze pro jednobajtové znaky (takže v lokalizacích UTF-8, pouze u ASCII písmen).

1

Pokud se někdo stále pokouší o pokus o ${str^^}, si můžete vyzkoušet python -c nebo Perl Je pravděpodobné, že bash verze je nižší než 4.

Ale zatím bash 4 nebo přes pracuje rychle s existujícím řešením.

L2U="I will be upper"

Použitím python -c in bash

python -c "print('$L2U'.upper())"
I WILL BE UPPER

Podobně lze také použít k kapitalizaci pomocí:

service="bootup.sh on home"
python -c "print('$service'.capitalize())"
Bootup.sh on home

Pomocí Perl

echo $L2U | Perl -ne 'print "\U$_"'
I WILL BE UPPER
0
Rakib Fiha