kzen.dev
  • Frågor
  • Taggar
  • Användare
Meddelanden
Belöningar
Registrering
När du har registrerat dig kommer du att få information om svar och kommentarer på dina frågor.
Logga in
Om du redan har ett konto loggar du in för att kontrollera nya meddelanden.
Det kommer att finnas belöningar för frågor, svar och kommentarer.
Mer
Källa
Redigera
 Naftaly
Naftaly
Question

Kontrollera antalet argument som skickas till ett Bash-skript

Jag vill att mitt Bash-skript ska skriva ut ett felmeddelande om antalet nödvändiga argument inte är uppfyllt.

Jag försökte med följande kod:

#!/bin/bash
echo Script name: $0
echo $# arguments 
if [$# -ne 1]; 
    then echo "illegal number of parameters"
fi

Av någon okänd anledning har jag fått följande fel:

test: line 4: [2: command not found

Vad gör jag fel?

659 2013-09-02T08:28:51+00:00 3
 konsolebox
konsolebox
Redigerad fråga 2019ör augusti 2019 в 1:23
Programmering
bash
parameter-passing
command-line-arguments
Popular videos
The Vietnam War: Reasons for Failure - Why the U.S. Lost
The Vietnam War: Reasons for Failure - Why the U.S. Lost
för 10 år sedan
Customizing Cloud9 and the CS50 IDE by Dan Armendariz
Customizing Cloud9 and the CS50 IDE by Dan Armendariz
för 6 år sedan
CS50 2014 - Week 8
CS50 2014 - Week 8
för 8 år sedan
You Bet Your Life: Secret Word - Water / Face / Window
You Bet Your Life: Secret Word - Water / Face / Window
för 10 år sedan
CS50 2014 - Week 7
CS50 2014 - Week 7
för 8 år sedan
Words at War: The Ship / From the Land of the Silent People / Prisoner of the Japs
Words at War: The Ship / From the Land of the Silent People / Prisoner of the Japs
för 10 år sedan
3000+ Common English Words with Pronunciation
3000+ Common English Words with Pronunciation
för 7 år sedan
Web Security: Active Defense, by Luciano Arango
Web Security: Active Defense, by Luciano Arango
för 9 år sedan
Never say "If" writing a Bash script! (Exit codes & logical operators)
Never say "If" writing a Bash script! (Exit codes & logical operators)
för 3 år sedan
Using BASH Script Arguments
Using BASH Script Arguments
för 6 år sedan
Bash script to Prompt the user for a Password
Bash script to Prompt the user for a Password
för 3 år sedan
Calling All Cars: Muerta en Buenaventura / The Greasy Trail / Turtle-Necked Murder
Calling All Cars: Muerta en Buenaventura / The Greasy Trail / Turtle-Necked Murder
för 10 år sedan
sed: Easily replace strings across files | #7 Practical Bash
sed: Easily replace strings across files | #7 Practical Bash
för 3 år sedan
Shell Scripting Tutorial for Beginners 4 - Pass Arguments to a Bash-Script
Shell Scripting Tutorial for Beginners 4 - Pass Arguments to a Bash-Script
för 6 år sedan
Dragnet: Big Kill / Big Thank You / Big Boys
Dragnet: Big Kill / Big Thank You / Big Boys
för 10 år sedan
Troubleshooting Windows Lockups, Application Hangs, and Blue Screen of Death
Troubleshooting Windows Lockups, Application Hangs, and Blue Screen of Death
för 1 år sedan
Google Colab - Interactive Graphs, Tables and Widgets!
Google Colab - Interactive Graphs, Tables and Widgets!
för 1 år sedan
How to pass arguments on the command line using bash script
How to pass arguments on the command line using bash script
för 1 år sedan
BASH Shifting Argument Variables Linux Shell Tutorial
BASH Shifting Argument Variables Linux Shell Tutorial
för 3 år sedan
Bash Scripting 5 -- Arguments
Bash Scripting 5 -- Arguments
för 7 år sedan
passing a file as argument to a bash script
passing a file as argument to a bash script
för 2 år sedan
Command line arguments to a shell script | positional arguments in shell scripting | shift command
Command line arguments to a shell script | positional arguments in shell scripting | shift command
för 1 år sedan
Bash Script: Invalid argument (4 Solutions!!)
Bash Script: Invalid argument (4 Solutions!!)
för 2 år sedan
How to Use Command Line Arguments in a Bash Script
How to Use Command Line Arguments in a Bash Script
för 1 år sedan
04. Shell Scripting Tutorial for Beginners - Pass Arguments to a Bash Script
04. Shell Scripting Tutorial for Beginners - Pass Arguments to a Bash Script
för 5 år sedan
Using the 'if' statement in a Bash script
Using the 'if' statement in a Bash script
för 1 år sedan
Parameters Arguments Linux Shell Script Tutorial
Parameters Arguments Linux Shell Script Tutorial
för 7 år sedan
Reading File Data into a Bash Script
Reading File Data into a Bash Script
för 3 år sedan
MULTIPLICATION TABLE - bash script
MULTIPLICATION TABLE - bash script
för 1 år sedan
Apprendre Le Bash Script : Les Commentaires & Les Variables (Darija)
Apprendre Le Bash Script : Les Commentaires & Les Variables (Darija)
för 3 år sedan
A Writer at Work / The Legend of Annie Christmas / When the Mountain Fell
A Writer at Work / The Legend of Annie Christmas / When the Mountain Fell
för 10 år sedan
TechDays 2018 - MVP Show Case - Hantera en Microsoft baserad plattform med PowerShell, rätt verktyg.
TechDays 2018 - MVP Show Case - Hantera en Microsoft baserad plattform med PowerShell, rätt verktyg.
för 4 år sedan
How To - Set Up Mad Max Plotter in Windows - Step by Step Tutorial
How To - Set Up Mad Max Plotter in Windows - Step by Step Tutorial
för 1 år sedan
« Föregående
Nästa »
Den här frågan har 1 svar på engelska, för att läsa dem logga in på ditt konto.
Solution / Answer
 konsolebox
konsolebox
2013ör september 2013 в 8:30
2013-09-02T08:30:04+00:00
Mer
Källa
Redigera
#22103187

Precis som alla andra enkla kommandon kräver [ ... ] eller test mellanslag mellan argumenten.

if [ "$#" -ne 1 ]; then
    echo "Illegal number of parameters"
fi

Eller

if test "$#" -ne 1; then
    echo "Illegal number of parameters"
fi

Förslag

När du använder Bash, föredrar du att använda [[[ ]] istället eftersom det inte gör orddelning och expansion av sökvägar för sina variabler som kanske inte behöver citeras om det inte är en del av ett uttryck.

[[ $# -ne 1 ]]

Den har också en del andra funktioner, t.ex. gruppering av villkor utan anföringstecken, mönstermatchning (utökad mönstermatchning med extglob) och regexmatchning.

Följande exempel kontrollerar om argumenten är giltiga. Det tillåter ett enda argument eller två.

[[ ($# -eq 1 || ($# -eq 2 && $2 == <glob pattern>)) && $1 =~ <regex pattern> ]]

För rena aritmetiska uttryck kan det fortfarande vara bättre att använda (( )) för vissa, men de är fortfarande möjliga i [[ ]] med dess aritmetiska operatörer som -eq, -ne, -lt, -le, -gt eller -ge genom att placera uttrycket som ett enda strängargument:

A=1
[[ 'A + 1' -eq 2 ]] && echo true  ## Prints true.

Det borde vara till hjälp om du behöver kombinera det med andra funktioner i [[[ ]] också.

Avsluta skriptet

Det är också logiskt att låta skriptet avslutas när ogiltiga parametrar skickas till det. Detta har redan föreslagits i comments av ekangas men någon redigerade detta svar för att få det med -1 som returnerat värde, så jag kan lika gärna göra det rätt.

Även om -1 accepteras av Bash som ett argument för exit är det inte uttryckligen dokumenterat och det är inte rätt att använda det som ett vanligt förslag. 64 är också det mest formella värdet eftersom det är definierat i sysexits.h med #define EX_USAGE 64 /* command line use error */. De flesta verktyg som ls returnerar också 2 vid ogiltiga argument. Jag brukade också returnera 2 i mina skript, men på senare tid har jag inte längre brytt mig om det och har helt enkelt använt 1 i alla fel. Men låt oss bara placera 2 här eftersom det är vanligast och förmodligen inte OS-specifikt.

if [[ $# -ne 1 ]]; then
    echo "Illegal number of parameters"
    exit 2
fi

Referenser

  • [Bash villkorliga uttryck] (https://www.gnu.org/software/bash/manual/bash.html#Bash-Conditional-Expressions)
  • Villkorliga konstruktioner
  • Mönstermatchning
  • Orddelning
  • Expansion av filnamn (tidigare expansion av söknamn)
  • Enkla kommandon
 konsolebox
konsolebox
Redigerat svar 2019ör augusti 2019 в 2:14
991
0
Aleks-Daniel Jakimenko-A.
Aleks-Daniel Jakimenko-A.
2013ör december 2013 в 8:50
2013-12-14T20:50:24+00:00
Mer
Källa
Redigera
#22103189

Det kan vara en bra idé att använda [aritmetiska uttryck] (http://wiki.bash-hackers.org/syntax/arith_expr) om du har med siffror att göra.

if (( $# != 1 )); then
    echo "Illegal number of parameters"
fi
 fabian789
fabian789
Redigerat svar 2017ör juli 2017 в 2:12
Arithmetic expressions [Bash Hackers Wiki]
wiki.bash-hackers.org
67
0
 jhvaras
jhvaras
2014ör januari 2014 в 10:13
2014-01-07T10:13:26+00:00
Mer
Källa
Redigera
#22103190

På []: !=, =, == ... är sträng jämförelseoperatörer och -eq, -gt ... är aritmetiska binära.

Jag skulle använda:

if [ "$#" != "1" ]; then

Eller:

if [ $# -eq 1 ]; then
38
0
Lägg till en fråga
Kategorier
Alla
Teknik
Kultur / fritid
Livet / Konst
Vetenskap
Professionell
Företag
Användare
Alla
Ny
Populära
1
Daniel Gogov
Registrerad för 6 dagar sedan
2
工藤 芳則
Registrerad för 1 vecka sedan
3
Ирина Беляева
Registrerad för 2 veckor sedan
4
Darya Arsenyeva
Registrerad för 2 veckor sedan
5
anyta nuam-nuam (LapuSiK)
Registrerad för 2 veckor sedan
CS
DE
EL
ES
FR
ID
IT
JA
LT
NL
NO
PT
RO
RU
SK
SL
SV
TR
ZH
© kzen.dev 2023
Källa
stackoverflow.com
under licens cc by-sa 3.0 med angivande av